ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Data Warehouse Guide阅读笔记(六):unique constraint & unique index

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

原创 Linux操作系统 作者:NinGoo 时间:2019-06-01 07:00:07 0 删除 编辑

一般情况下,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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: Family
请登录后发表评论 登录
全部评论

注册时间:2004-12-07

  • 博文量
    108
  • 访问量
    80131