什么叫覆盖索引?

0
已邀请:
4

戴俊青 - 微软数据库开发和性能调优 2013-07-24 回答

覆盖索引是在所有为满足SQL查询不用到到达基本表所需的列上建立起来的非聚簇索引,如果查询查询遇到一个索引并且完全不需要引用底层数据表,那么该索引可以被认为是覆盖索引。
简单的可以理解为,我们所需要查询的列包含在了建立的非聚簇索引里。
下面我利用ADVENTUREWORKS数据库建立测试环境:
USE AdventureWorks
go
set statistics io on
go

select
a.postalcode
from person.address as a
where a.stateprovinceID=42
--消息:
表'Address'。扫描计数1,逻辑读取18 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

111.jpg


创建索引:
create Nonclustered index on
person.address(stateprovinceID )
include (postalcode)
with(
drop_existing=on
)
重新执行查询语句:
USE AdventureWorks
go
set statistics io on
go
select
a.postalcode
from person.address as a
where a.stateprovinceID=42
--消息
(8 行受影响)
表'Address'。扫描计数1,逻辑读取2 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
执行计划:
{S`MRXMNY{PVFJ2A2010~GL.jpg

从反馈的消息里很容易看出来,逻辑读从18下降到2,做了很明显的改善了。
1

TravyLee - 尼玛!这哪是下雨,分明就是有人在泼水! 2013-07-25 回答

0

Pearl 2013-07-24 回答

什么是‘键查找’,如果 索引创建语句改成
create Nonclustered index on
person.address(stateprovinceID )
,是不是就是一般的索引, 还是要 用到 键查找。

要回复问题请先登录注册