今天观看SQL Server的一个视频讲座,其中有一段很有意思,得记下来
聚集索引,也可以理解为排序索引,就是说表中的数据存储位置,根据索引的排序进行实际存储,因此效率是相当高的。因为聚集索引决定了表中数据行的存储位置,所以,一个表不可能有两个或以上的聚集索引。因此,如果一个表中已经有一个聚集索引,那么这个表中其他的索引都将是非聚集索引。
那么在SQL Server中他们有关系吗?以前我也认为没有,可是今天看了这个讲座后,才知道不单单是有关系,而且非常之大。举例说明
create clustered idx_name on table(name)
create idx_no on table(no)
表中实际的数据存储方式为
table
no name remark
1 a
3 a
2 b
5 b
4 c xxc1
6 c xxc2
聚集索引数据页
建值地址 健值 数据地址
0001 a XXXX
0002 b XXXX
0003 c XXc1
非聚集索引数据页
健值 聚集建值 聚集地址
1 a 0001
2 b 0002
3 a 0001
4 c 0003
5 b 0002
6 c 0003
select * from table where no =4
(1)先根据非聚集索引进行索引查找,找到聚集健值c
(2)然后根据c值,在聚集索引中查找到数据地址XXc1
(3)然后从xxc1开始比较no = 4的数据行,找后返回
大体应该就是这个样子了,不知道理解是否到位。从上面的分析我们可以看出,对于聚集索引的创见,是一个很关键的问题,如果创建的好,将有助于提高效率,如果创建的不好,反而会降低性能。为什么哪?
比如我们把聚集索引创建在no列上,其实和没有创建聚集索引查不太多,因为no列是一个唯一的顺序列,有多少行no就有多少行索引行,意义不大。所以在创建聚集索引的时候一定不能拍拍屁股就决定下来,要根据具体情况,尤其是表中的数据情况进行分析后再决定。