SQL Server中的聚簇索引和非聚簇索引(一)

收藏本信息编号:220 发布时间:2009-07-27 截止日期: 地区:

 
 
概述
     什么时候使用聚簇索引或非聚簇索引呢?回答这个问题有点难度,坦白地说,我即将给出的答案是一个流传已久的标准数据库管理员的回答:具体问题具体分析。有大量因素影响何时以及何地进行索引创建。幸好只有两个选择,但分析这两个选择的优缺点都相当复杂。

     基础
     在此,我并不打算对最低层的索引功能进行详细的探讨。关于这个主题的书已经有一整套书籍了,同时有一群人都专注于索引创建。现在只需要知道:有一个聚簇索引总比没有索引强。聚簇索引和非-聚簇索引之间最大的不同是,当我们使用一个聚簇索引时,包含聚簇索引的表格部分的数据页与包含非-聚簇索引的数据页之间的数据传输是不同。
关于SQL Server 2005,我们大概都知道堆或B-Tree。在此需要指出的是,一个没有聚簇索引的表一般指的是一个堆。而B-Tree平衡树是聚簇索引所采用的通用结构。它们有点类似于电话簿。我们知道SQL Server 2005有8K的数据页。同时还有8个不同类型的数据页。索引数据页面有指向较小数据子集的指针,同时这些数据子集也有指向更小数据子集的指针,以此类推。比如,当我们打开电话簿时,在反面的左上或右角我们可以看到什么呢?我们可以看到页面的范围。这就是B-Tree的功能了。
那么此处它们有何不同呢?当应用一个聚簇索引时,在叶级的数据包含了实际的数据页,这里存储了我们所要查询的数据。在非聚簇索引中,在叶级的数据页仅包含指向所查询的实际数据的数据页的指针。因此,一个聚簇索引的叶级数据页只有一种排序方式,并且是有序的
        比如,如果一个字段加了一个IDENTITY约束并创建了一个聚簇索引,那么构成IDENTITY约束的数字总是有序的。但是,它并不总是连续的,因为我们可能会DELETE记录行。但是它们总是有序的。这样就可以实现非常快速的查询,特别是在用于诸如订单或发票ID的应用中。
注意事项
关于使用聚簇索引或非聚簇索引的权衡是所谓给和取概念。我所知道的最重要的一点是,由于聚簇索引将它们的所有数据都保留在B-Tree的叶级中,因此,任何数据修改都要求重新排列数据页。这就意味着,如果我们添加一个聚簇索引到一个有大量插入、更新或删除操作的表中,那么,比起使用一个非聚簇索引,我们将可能需要更频繁地重建索引或清除索引碎片。这是所有数据页面移动所造成的。再次,这样做的好处是由于数据的有序排列,我们可以得到更快的数据读取速度。其中一个最大的不同是,每个表只能有一个聚簇索引。但是,每个表可以应用249个非聚簇索引。
记住,虽然在每个表中只能有一个聚簇索引,但是它并不一定是由一个字段组成的。更常用的做法是将它应用到多个字段中来创建成覆盖索引。考虑表的搜索条件:正在查询
什么?如果在同一时间查询多个字段,那么覆盖索引可能就是我们要的结果。另外一个折衷的办法是先评估正在查询的内容,然后将一个聚簇索引应用到WHERE子句用到最多的一个字段中。然后在SELECT语句中的其余字段中应用一个覆盖非聚簇索引。
最后,我们还可以使用索引视图。实际上,这是Microsoft实现的所谓物化视图。注意——当我们将一个索引应用到视图时,我们此时是在创建一个新的数据库对象,然而,来自非聚簇索引视图的结果集只在会话打开的时间内存在,并且它是完全虚拟的。而索引视图则不是这样的。

发布人信息

[错误报告] [推荐] [收藏][打印] [关闭] [返回顶部]

当前共有0人发表了评论.

推荐信息

最新信息