sqlserver创建索引时的include--覆盖索引

 

执行一个sql

select id,name from s_student where class_id = '1'

对于sqlserver 2000. 如果使用覆盖索引, 可以建立索引

CREATE NONCLUSTERED INDEX IX_CLASSID_1      
ON dbo.s_student (class_id,id,name)

如果有查询是 select xxx from s_student where class_id = xx and id = xx and name = xx

上面的索引建立是没问题的, 但如果光为了实现覆盖索引,这样需要的维护索引的成本更大.

故在sqlserver 2005后出现了include. 其 include的列也会加入到索引的子叶层中,但不会对其做排序等相关的维护操作,仅作为索引的扩展功能

CREATE NONCLUSTERED INDEX IX_CLASSID_1      
ON dbo.s_student (class_id)
INCLUDE (id, name); 

执行过程如下:

1) [s_student] 表在[class_id]列上有一个非聚集索引,因此它查找非聚集索引的根节点中找出[class_id]= '1'的记录)

2) 从包含[class_id]= '1'记录的索引中间节点中找到指向该记录的子叶层页号)

3) 从索引的子叶层中针对每一行数据,通过书签查找从聚集索引(如主键)或数据表中找出具体的记录

4) SQL Server引擎从3中的记录查找 id和name 列的值。

但创建了覆盖索引的话, include 中包含了 select 中所有查询的列. 那么将省去 3.4步, 直接从非聚集索引的子叶层中把 id,name都获取到. 

更详细见:

https://www.cnblogs.com/chillsrc/archive/2012/09/04/2671092.html

 

你可能感兴趣的:(sqlserver创建索引时的include--覆盖索引)