用函式索引構造特殊的約束
最近在看tom的《oracle高效設計》一書,在高效的設計模式一章中,tom介紹瞭如何利用函式索引來實現一些特殊的約束。
假如有這樣一個需求:
表t在status='N'的情況下id必須唯一,否則id可以不唯一。
實現這種需求,可以透過觸發器來做,但也可以用函式索引來做到這一點。
請看下例:
SQL> create table t_unique(id number,status char(1));
Table created
SQL> create unique index uni_t_unique on t_unique(decode(status,'N',id,null));
Index created
SQL> insert into t_unique values(1,'Y');
1 row inserted
SQL> insert into t_unique values(1,'Y');
1 row inserted
--當status='Y'時,插入相同ID不會報錯
SQL> insert into t_unique values(2,'N');
1 row inserted
SQL> insert into t_unique values(2,'N');
insert into t_unique values(2,'N')
ORA-00001: 違反唯一約束條件 (SUK.UNI_T_UNIQUE)
--當status='N'時,id必須唯一,否則就報錯。
SQL> commit;
Commit complete
這樣做除了實現了特殊約束外,在某些情況下可以提高效能。
比如:
status='N'表示是活躍資料,使用者經常需要查詢。
status='Y'表示歷史資料,查詢基本不會涉及到
使用者經常需要透過ID來查詢表的活躍資料。為了提高效率,常規方法是在ID列或者(ID,status)建立索引,這樣做的不足之處是索引了不必要的資料,
浪費空間,並且只能透過索引範圍掃描,效率也比不上唯一索引掃描。
而用函式方法建立的索引不但節省了空間,查詢更是可以用到唯一性索引,效能也可以提高。
1* select /*+ index(t_unique) */ * from t_unique where decode(status,'N',id,null)=2
> /
ID S
---------- -
2 N
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=16)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T_UNIQUE' (Cost=1 Card=1
Bytes=16)
2 1 INDEX (RANGE SCAN) OF 'UNI_T_UNIQUE' (UNIQUE) (Cost=1 Ca
rd=1)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
426 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63781/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 利用函式索引解決複雜的約束問題函式索引
- C# 泛型 new()建構函式約束C#泛型函式
- ts函式約束定義函式
- 建約束(Constraint)時隱式建立索引(Index)及先建立索引後建立約束的區別AI索引Index
- 構造java函式(轉)Java函式
- MySQL中的 UNIQUE約束和UNIQUE索引MySql索引
- Oracle主鍵約束、唯一鍵約束、唯一索引的區別(轉)Oracle索引
- 構造和解構函式呼叫順序函式
- Oracle如何管理帶約束的B樹索引Oracle索引
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- 構造解構函式的妙用-成對出現 (轉)函式
- 函式索引使用細節——自定義函式的索引化函式索引
- 解決資料庫的索引亂碼問題,先刪除外來鍵約束,再刪除主鍵約束及其索引資料庫索引
- 查詢oracle表的資訊(表,欄位,約束,索引)Oracle索引
- SQL SERVER中找出拙劣的約束,索引,外來鍵SQLServer索引
- oracle 約束的novalidate 應用Oracle
- Python 自定義函式的特殊屬性(收藏專用)Python函式
- C++ 建構函式實戰指南:預設構造、帶引數構造、複製構造與移動構造C++函式
- Random 函式在批量造資料中的運用random函式
- 直譯器構造實現函式呼叫函式
- Oracle - 約束、索引等相關常用操作語句Oracle索引
- 第八章:不要在構造和解構函式中使用虛擬函式函式
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter
- 區分:派生類指定基類建構函式、繼承構造、委託構造函式繼承
- 基於函式的索引函式索引
- 函式索引的問題函式索引
- 函式索引的儲存函式索引
- 函式索引陷阱函式索引
- oracle函式索引Oracle函式索引
- Unique約束,Primary Key約束與索引的關係學習與測試_20091213.doc索引
- 很多人比較糾結的約束和索引的關係索引
- Javaweb-約束-外來鍵約束JavaWeb
- 函式索引的兩個應用場景示例(下)函式索引
- 類的建構函式和解構函式函式
- C++ 移動構造和複製建構函式匹配C++函式
- Oracle基於函式的索引Oracle函式索引
- Oracle之函式索引Oracle函式索引
- 說說函式索引函式索引