Data Warehouse Guide閱讀筆記(六):unique constraint & unique index
發表於: 2006.10.25 10:10
分類: DW&BI
出處: http://ningoo.itpub.net/post/2149/223696
---------------------------------------------------------------[@more@]
一般情況下,unique constraint都是透過unique index來實現的。但是在資料倉儲中,由於資料量巨大,建立一個索引可能需要花費相當大的時間和空間,假如查詢中又用不上這個索引的話,那麼建立索引的高代價卻沒有帶來什麼收益,這是很不划算的。
舉個例子,假如有一個sales表,其中sales_id的資料是唯一的,我們在sales_id上建一個unique constraint,語法如下:
alter table sales add constraint sales_uk unique(sales_id);
這樣建立的unique constraint是enable validate狀態的,oracle會自動在sales_id列上建立一個的名為sales_uk的unique index。透過查詢user_indexes或者user_ind_columns檢視可以看到這個index:
SQL> select index_name,column_name from user_ind_columns where index_name='SALES_UK';
INDEX_NAME COLUMN_NAME
------------------------------ ------------------------------
SALES_UK SALES_ID
在資料倉儲環境中,這個unique index可能是不合適的:
1.這個索引可能會相當的大。
2.在查詢中幾乎不會用到sales_id來做為過濾條件
3.多數情況下,sales會是一個分割槽表,而且分割槽鍵不會是sales_id。這樣這個unique index必須是global index,在對分割槽的一些DDL操作中可能會導致global index失效。
那麼怎麼能在建立unique constraint的同時不生成unique index呢?
很簡單,建立一個狀態為disable validate的unique constraint就能滿足上述要求。
alter table sales add constraint sales_uk unique(sales_id) disable validate;
再來查詢user_ind_columns可以發現沒有記錄:
SQL> select index_name,column_name from user_ind_columns where index_name='SALES_ID';
no rows selected
但是disable validate狀態的索引會導致無法對該列進行DML操作
SQL> delete from sales where rownum=1;
delete from sales where rownum=1
*
ERROR at line 1:
ORA-25128: No insert/update/delete on table with constraint (NING.SALES_UK) disabled and validated
那麼,要修改有disable validate約束的表中的資料,只有以下兩種方法:
1.使用DDL操作,比如分割槽表的exchange partition
2.首先drop constraint,修改資料,再重新建立disable validate的constraint
(需要引用, 請註明出處: http://ningoo.itpub.net)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/82387/viewspace-1017044/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Data Warehouse Guide閱讀筆記(七):partition tableGUIIDE筆記
- The Data Warehouse Toolkit 閱讀筆記筆記
- Data Warehouse Guide閱讀筆記(八):materialized view之一GUIIDE筆記ZedView
- Data Warehourse Guide閱讀筆記(五):Bitmap join indexGUIIDE筆記Index
- Data Warehouse Guide文件筆記(四):dimensionGUIIDE筆記
- Index Unique Scan (213)Index
- Data Warehouse Guide文件筆記(一):Data warehouse和OLTP系統的對比GUIIDE筆記
- Sparse Indexes vs unique indexIndex
- pk 、unique index 和 index 區別Index
- Data Warehouse Guide文件筆記(三):RELY constraintsGUIIDE筆記AI
- Building the Data Warehouse - Fourth Edithin - 讀書筆記UI筆記
- Bug 2784796: ORA-00001:UNIQUE CONSTRAINTAI
- INDEX UNIQUE SCAN,INDEX FULL SCAN和INDEX FAST FULL SCANIndexAST
- unique index與primary key的區別Index
- Unique Index和Normal Index差異經典對比IndexORM
- 再說Unique Index和Normal Index行為差異IndexORM
- [20171211]UNIQUE LOCAL(Partitioned)IndexIndex
- 高效的SQL(Index unique scan最優化)SQLIndex優化
- 索引唯一性掃描(INDEX UNIQUE SCAN)索引Index
- 在什麼情況下用index unique scansIndex
- Unique Array
- MySQL中的 UNIQUE約束和UNIQUE索引MySql索引
- ORA-00001 Unique Constraint SYS.I_JOB_JOB ViolatedAI
- mysql中key 、primary key 、unique key 與index區別MySqlIndex
- 唯一性索引(Unique Index)與普通索引(Normal Index)差異(上)索引IndexORM
- 唯一性索引(Unique Index)與普通索引(Normal Index)差異(中)索引IndexORM
- 唯一性索引(Unique Index)與普通索引(Normal Index)差異(下)索引IndexORM
- ORA-00001 : Unique Constraint Violated caused by DATE VS Timestamp(6)AI
- 夢斷程式碼閱讀筆記之六筆記
- ORA-02429: cannot drop index used for enforcement of unique/primary keyIndex
- ORA-00001: UNIQUE CONSTRAINT (SYS.WRI$_SQLSET_PLANS_PK) VIOLATEDAISQL
- ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys foundIndex
- 閱讀筆記筆記
- :[IBM][ODBC Oracle Wire Protocol driver][Oracle]ORA-00001: unique constraint (SCIBMOracleProtocolAI
- Laravel unique驗證 排除當前記錄Laravel
- OGG How to handle / replicate tables with no (without) primary key (PK) or unique index (UI) (UPI) [IndexUI
- 主鍵(PK)與非空唯一索引(Unique Index)的區別索引Index
- SQL Server Unique ConstratintsSQLServer