一般情况下,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
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/193161/viewspace-50194/,如需转载,请注明出处,否则将追究法律责任。