转自:http://blog.sina.com.cn/s/blog_6e4810810101rv52.html
在DB2中,添加unique关键词可以创建表索引列的唯一索引。
( CREATE UNIQUE INDEX indname ON tabname(colname) )
那么唯一索引与一般索引有何区别呢?我们来从下面两个方面来看。
一.数据加载性能
为什么说会对加载性能有影响,是由于也许存在该种假设:唯一索引为了在每条新数据插入后,当中是否会做这么一步操作来确保数据的唯一性?那么就设计一个实验来验证一下。
现在我建了两张表结构相同的两张表T1和T2,区别在于T1建了唯一索引、T2建了一般索引。
1.分别对两表加载同一份400W行的数据(文件大小约5.2GB)且索引字段的数据不重复,索引创建为REBUILD。结果:
2.现在两表都有400W行的数据存量,接下来再分别导入99W行的新数据(同样索引字段的数据不重复),索引创建为方式为INCREMENTAL.结果:
3.现在我清空T1,并创建表结构相同的T3,T3不建索引,但索引字段加上唯一约束。对400W行的数据的第一行多复制一行变为40000001行,结果:
虽然T3并未执行建索引的操作,但是最后T3的加载日志里出现了更索引时间的相关信息。说明当某列被设定了唯一约束时,系统会对该列自动生成了一个唯一索引。(这个索引名一看就像是系统起的)
相反的,对表的某个字段创建了唯一索引,但系统并不会对该列自动添加唯一约束。所以唯一索引与唯一键的小区别就是,当T1删除唯一索引后,重复的数据是允许被插入的。而唯一键自动生成的唯一索引是不允许被drop的,当取消唯一约束时,该索引也会自动删除。
当有重复的数据时,都是在更新索引时将重复的行做delete。
从上述的三个加载实验中,我们可以得知:
1.唯一索引对加载数据没有影响。当有重复数据时,影响的是其更新索引的时间。
2.DB2是通过更新索引时,索引列排序来检查数据唯一性的。
二.索引的属性数值
再来看下唯一索引与一般索引的属性数值:
网上对唯一索引的描述里有这么一句话我来吐槽下,这句话是这样的:
只能说稠密度大的索引性能高,不能说唯一索引的性能比一般索引高。虽然知道他所要表达的意思,但明显这个话说的不严谨。从西瓜堆中挑个较熟的西瓜,和从水果拼盘中挑个西瓜片来吃的用时是不一样的,可这两件事没有可比性。比如现在用实验1中的两张表T1、T2去执行同一个查询命令,其所用的查询时间并没有差异。
唯一索引和唯一约束的作用是一致的,都是用来保证数据的唯一性。其对加载及查询均无任何添加的副作用。