ITPub博客

首页 > 数据库 > 数据库开发技术 > Data Warehouse Guide阅读笔记(六):unique constraint & unique index

Data Warehouse Guide阅读笔记(六):unique constraint & unique index

原创 数据库开发技术 作者:asword 时间:2009-02-09 16:37:41 0 删除 编辑
作者: 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博客 ” ,链接:https://blog.itpub.net/82387/viewspace-1017044/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-17

  • 博文量
    137
  • 访问量
    399357