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

日期: 2009-03-19 作者:Laurence Schwarz翻译:曾少宁 来源:TechTarget中国 英文

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

关于这个主题的书已经有一整套书籍了,同时有一群人都专注于索引创建。现在只需要知道:有一个聚簇索引总比没有索引强。聚簇索引和非-聚簇索引之间最大的不同是,当我们使用一个聚簇索引时,包含聚簇索引的表格部分的数据页与包含非-聚簇索引的数据页之间的数据传输是不同。   关于SQL Serv……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

概述

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

  在此,我并不打算对最低层的索引功能进行详细的探讨。关于这个主题的书已经有一整套书籍了,同时有一群人都专注于索引创建。现在只需要知道:有一个聚簇索引总比没有索引强。聚簇索引和非-聚簇索引之间最大的不同是,当我们使用一个聚簇索引时,包含聚簇索引的表格部分的数据页与包含非-聚簇索引的数据页之间的数据传输是不同。

  关于SQL Server 2005,我们大概都知道“堆或B-Tree”。在此需要指出的是,一个没有聚簇索引的表一般指的是一个堆。而“B-Tree”或“平衡树”是聚簇索引所采用的通用结构。它们有点类似于电话簿。我们知道SQL Server 2005有8K的数据页。同时还有8个不同类型的数据页。索引数据页面有指向较小数据子集的指针,同时这些数据子集也有指向更小数据子集的指针,以此类推。比如,当我们打开电话簿时,在反面的左上或右角我们可以看到什么呢?我们可以看到页面的范围。这就是B-Tree的功能了。

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

  那么此处它们有何不同呢?当应用一个聚簇索引时,在“叶级”的数据包含了实际的数据页,这里存储了我们所要查询的数据。在非聚簇索引中,在叶级的数据页仅包含指向所查询的实际数据的数据页的指针。因此,一个聚簇索引的叶级数据页只有一种排序方式,并且是“有序的”。

  比如,如果一个字段加了一个IDENTITY约束并创建了一个聚簇索引,那么构成IDENTITY约束的数字总是有序的。但是,它并不总是连续的,因为我们可能会DELETE记录行。但是它们总是有序的。这样就可以实现非常快速的查询,特别是在用于诸如订单或发票ID的应用中。

  注意事项

  关于使用聚簇索引或非聚簇索引的权衡是所谓“给和取”概念。我所知道的最重要的一点是,由于聚簇索引将它们的所有数据都保留在B-Tree的叶级中,因此,任何数据修改都要求重新排列数据页。这就意味着,如果我们添加一个聚簇索引到一个有大量插入、更新或删除操作的表中,那么,比起使用一个非聚簇索引,我们将可能需要更频繁地重建索引或清除索引碎片。这是所有数据页面移动所造成的。再次,这样做的好处是由于数据的有序排列,我们可以得到更快的数据读取速度。其中一个最大的不同是,每个表只能有一个聚簇索引。但是,每个表可以应用249个非聚簇索引。

  记住,虽然在每个表中只能有一个聚簇索引,但是它并不一定是由一个字段组成的。更常用的做法是将它应用到多个字段中来创建成覆盖索引。考虑表的搜索条件:正在查询什么?如果在同一时间查询多个字段,那么覆盖索引可能就是我们要的结果。另外一个折衷的办法是先评估正在查询的内容,然后将一个聚簇索引应用到WHERE子句用到最多的一个字段中。然后在SELECT语句中的其余字段中应用一个覆盖非聚簇索引。

  最后,我们还可以使用索引视图。实际上,这是Microsoft实现的所谓“物化视图”。注意——当我们将一个索引应用到视图时,我们此时是在创建一个新的数据库对象,然而,来自非聚簇索引视图的结果集只在会话打开的时间内存在,并且它是完全虚拟的。而索引视图则不是这样的。

翻译

曾少宁
曾少宁

TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。

相关推荐