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

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值