SQL Server索引 - 非汇集索引 <第七篇>

1、非汇集索引维护

  非汇集索引的行定位器值保持相同的汇集索引值,即便该汇集索引列物理上从新定位后,也是如此。post

  为了优化这个维护开销,SQL Server添加一个指向旧数据页的指针,以在页面分割以后指向新的数据页面,而不是更新全部相关非汇集索引的行定位器。这样,虽然下降了非汇集索引的维护开销,可是增长了从非汇集索引行到数据行的导航开销,由于添加了一个旧数据页面和信数据页面之间的链接。所以,将汇集索引做为行定位器下降了非汇集索引相关的开销。性能

2、定义书签查找

  当一个查询请求不是优化器选择的非汇集索引一部分的列时,须要一个查找。这对一个汇集索引来讲是一个关键字查找,堆堆表来讲是一个RID查找。这些查找的统称来自于旧的定义名 - 书签查找。这种查找根据非汇集索引的行定位器值,从表中读取对应的数据行,除了索引页面上的逻辑读操做意外,还须要一个数据页面上的逻辑读。可是,若是查询须要的列在索引中,那么就不须要访问数据页面。这被称为覆盖索引。优化

  这些书签查找是大结果集最好使用汇集索引的缘由。汇集索引不须要书签查找,由于叶子页面就是数据页面。spa

3、非汇集索引的建议

  由于表只能有一个汇集索引,因此可使用多个非汇集索引的灵活性来帮助改进性能。下面将说明非汇集索引使用的决定因素。指针

  一、什么时候使用非汇集索引blog

  非汇集索引在须要从一个大表上读取少许的行的时候最有用,随着须要检索的行数量的增长,书签查找的开销成比例增长。为了从表中检索少许的行,索引列应该有很高的选择性。排序

  适合使用非汇集索引的状况:索引

  • 列具备高选择性;
  • 根据列获取少许数据;
  • 窄列;
  • 列常常被分组排序;

  下面给出不适合创建汇集索引,但也可以使用汇集索引的状况资源

  •   频繁更新的列;
  •   宽类型列;

  汇集索引频繁更新是很是消耗资源的,由于会影响表的顺序,同时也影响到其余索引,在频繁更新的列上的非汇集索引的开销不像汇集索引那么大。在非汇集索引上的更新操做被限定在基本表和非汇集索引上,它不影响表上的其余非汇集索引。class

  宽类型列也相似,非汇集索引列上使用宽类型,虽影响好比汇集索引那么大,可是也要当心使用。

  二、什么时候不使用汇集索引

  非汇集索引不适合于大量行的查询。这样的查询使用汇集索引更好,汇集索引不须要大量的书签查找,而非汇集索除了在索引列上检索的逻辑读外,书签查找也须要消耗太多资源。SQL Server查询优化器在检索大结果集时会考虑这一开销,并相应地放弃该非汇集索引。

不适合建非汇集索引的状况:获取大量数据;低选择性;

相关文章
相关标签/搜索