用函式索引構造特殊的約束
最近在看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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ts函式約束定義函式
- 主鍵約束、唯一約束和唯一索引索引
- Oracle如何管理帶約束的B樹索引Oracle索引
- 構造和解構函式呼叫順序函式
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter
- Random 函式在批次造資料中的運用random函式
- C++ 建構函式實戰指南:預設構造、帶引數構造、複製構造與移動構造C++函式
- Python基礎之特殊的函式--裝飾器和偏函式Python函式
- 區分:派生類指定基類建構函式、繼承構造、委託構造函式繼承
- 類的建構函式和解構函式函式
- TS中特殊型別-any、unknown、never和extends繼承約束、keyof的使用型別繼承
- C++ 移動構造和複製建構函式匹配C++函式
- 約束
- 嬰兒的出生為你解惑建構函式和構造程式碼塊函式
- C/C++中的new/delete、構造/解構函式、dynamic_cast分析C++delete函式AST
- Day76.雜湊表、雜湊函式的構造 -資料結構函式資料結構
- Javaweb-約束-外來鍵約束JavaWeb
- AppBoxFuture(七): 分散式外來鍵約束APP分散式
- 建構函式與解構函式函式
- 主建構函式有啥用函式
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- 關於建構函式與解構函式的分享函式
- Oracle索引梳理系列(六)- Oracle索引種類之函式索引Oracle索引函式
- [20180509]函式索引問題.txt函式索引
- MySQL函式索引及優化MySql函式索引優化
- [20211231]函式索引測試.txt函式索引
- 用於判別式人臉驗證的L2-約束softmax損失
- C++ 建構函式和解構函式C++函式
- 約束CONSTRAINTAI
- 03約束
- MySQL 約束MySql
- SQL約束SQL
- 建構函式與普通函式的區別函式
- 泛型的約束理解泛型
- Python中,類的特殊方法與內建函式的關聯Python函式
- (10)邏輯綜合新增約束(環境約束)
- 構造、析構期間被調虛擬函式發生的慘案,長教訓!函式