Data Warehouse Guide閱讀筆記(六):unique constraint & unique index

asword發表於2009-02-09
作者: NinGoo(http://ningoo.itpub.net)
發表於: 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章