SQL Server索引管理——索引创建建议和经验(三)

SQL Server索引管理——索引创建建议和经验(三)

非聚集索引

非聚集索引不影响数据在表页中的顺序,因为非聚集索引的叶页和表的数据页是独立的。需要行定位符从索引行导航到数据行。行定位器的结构决定于数据是以堆的形式存储还是以聚集索引的形式存储。数据以堆形式存储,RID为行定位器;一个有聚集索引的表,行定位器为聚集索引键。

非聚集索引的维护

非聚集索引的行定位器继续的使用相同的聚集索引键值,即使聚集索引行的物理重排。

为优化这个维护消耗,SQL Server在原数据页增加了一个指向页拆分后新页的指针,而不是更新所有相关非聚集索引的行定位器。尽管这样减少了维护非聚集索引的消耗,其增加了从非聚集索引导航到数据页的消耗,因为增加了新页到旧页的链接。因此,拥有聚集索引行定位器降低了关联非聚集索引的负载。

书签查找定义

当一个查询需要的列不是优化器选择的非聚集索引的部分列时,就需要查找了。对于聚集索引,被称为键查找(key lookup),对于堆,则为RID查找。这些查找的通用术语为书签查找(bookmark lookup)。查找是从根据索引行的行定位器找到表中的数据行,需要对数据行进行逻辑读,而不是索引页的逻辑读。然而,如果所有需要的列都包含在索引中,那么就不需要从数据页中读取数据了。这被称为覆盖索引。

书签查找是大的结果集最好有聚集索引的原因。聚集索引不需要书签查找,因为聚集索引的叶页和数据页相同。

非聚集索引的建议

因为表只能有一个聚集索引,你可以使用多个非聚集索引帮助改进性能。我将在下面介绍决定使用非聚集索引的因素。

何时使用非聚集索引

当你想要从一个大表中检索少量数据行是,非聚集索引是最有用的。随着检索的行数增多,书签查找的总开销相应增长。为从小表中检索少量数据行,索引列必须具有较高的选择性(selectivity)。

进一步,不适合聚集索引的列

  • 频繁更新的列

  • 宽键列

这些情况可以使用非聚集索引,因为,和聚集索引不同,它不影响表中的其他索引。在频繁更新列上的非聚集索引,和在该列上创建聚集索引的消耗不同。在非聚集索引上的更新操作仅限于基表和这个非聚集索引。它不影响表上的其他索引。类似的,在宽列上的非聚集索引,和聚集索引不同,也不会增加其他索引的大小。然而,仍然保持谨慎,对在高度更新或宽列(列集)上创建非聚集索引也是如此,因为这将增加查询活动的消耗。

何时不适应非聚集索引

非聚集索引那种查询大量行数据的语句。这种查询最好使用聚集索引,其不需要独立书签查找检索数据行。除非使用覆盖索引。

聚集索引 VS 非聚集索引

选择聚集索引还是非聚集索引的主要影响因素如下:

  • 被检索的数据行

  • 数据的排序需求

  • 索引键宽度

  • 列的更新频率

  • 书签消耗

  • 磁盘热点

如果喜欢,可以搜索关注 MSSQLServer 公众号,将有更多精彩内容分享:

                                                                 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章