非汇集索引的行定位器值保持相同的汇集索引值,即便该汇集索引列物理上从新定位后,也是如此。post
为了优化这个维护开销,SQL Server添加一个指向旧数据页的指针,以在页面分割以后指向新的数据页面,而不是更新全部相关非汇集索引的行定位器。这样,虽然下降了非汇集索引的维护开销,可是增长了从非汇集索引行到数据行的导航开销,由于添加了一个旧数据页面和信数据页面之间的链接。所以,将汇集索引做为行定位器下降了非汇集索引相关的开销。性能
当一个查询请求不是优化器选择的非汇集索引一部分的列时,须要一个查找。这对一个汇集索引来讲是一个关键字查找,堆堆表来讲是一个RID查找。这些查找的统称来自于旧的定义名 - 书签查找。这种查找根据非汇集索引的行定位器值,从表中读取对应的数据行,除了索引页面上的逻辑读操做意外,还须要一个数据页面上的逻辑读。可是,若是查询须要的列在索引中,那么就不须要访问数据页面。这被称为覆盖索引。优化
这些书签查找是大结果集最好使用汇集索引的缘由。汇集索引不须要书签查找,由于叶子页面就是数据页面。spa
由于表只能有一个汇集索引,因此可使用多个非汇集索引的灵活性来帮助改进性能。下面将说明非汇集索引使用的决定因素。指针
一、什么时候使用非汇集索引blog
非汇集索引在须要从一个大表上读取少许的行的时候最有用,随着须要检索的行数量的增长,书签查找的开销成比例增长。为了从表中检索少许的行,索引列应该有很高的选择性。排序
适合使用非汇集索引的状况:索引
下面给出不适合创建汇集索引,但也可以使用汇集索引的状况资源
汇集索引频繁更新是很是消耗资源的,由于会影响表的顺序,同时也影响到其余索引,在频繁更新的列上的非汇集索引的开销不像汇集索引那么大。在非汇集索引上的更新操做被限定在基本表和非汇集索引上,它不影响表上的其余非汇集索引。class
宽类型列也相似,非汇集索引列上使用宽类型,虽影响好比汇集索引那么大,可是也要当心使用。
二、什么时候不使用汇集索引
非汇集索引不适合于大量行的查询。这样的查询使用汇集索引更好,汇集索引不须要大量的书签查找,而非汇集索除了在索引列上检索的逻辑读外,书签查找也须要消耗太多资源。SQL Server查询优化器在检索大结果集时会考虑这一开销,并相应地放弃该非汇集索引。
不适合建非汇集索引的状况:获取大量数据;低选择性;