执行一个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