什么是过滤索引?

0
已邀请:
0

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

过滤索引是使用了过滤器的非聚集索引,这个过滤器基本上是WHERE子句,用来过滤索引列上的关键字组,具体的创建语法如下:
1.jpg

例如:一个具有大量NULL值得列可能被存储为稀疏列来降低NULL值得开销。我们可以在这个列上添加一个过滤索引将null值排除掉,获得一个没有null值得索引。
在ADVENTUREWORKS中建立如下语句:
set statistics io on
go
select
soh.purchaseordernumber
, soh.orderdate
, soh.shipdate
, soh.salespersonID
from sales.salesorderheader as soh
where purchaseordernumber like 'Po5%'
AND soh.salespersonid is not null
其中表salesorderheader列purchaseordernumber含有大量的null值,运行该语句,得到的返回信息:
2.jpg

执行计划:
3.jpg

很明显这个查询语句逻辑读取的开销很大,用下面的语句创建一个过滤索引,来剔除掉列purchaseordernumber中的null值:
create nonclustered index IX_TEST
on sales.salesorderheader(purchaseordernumber,salespersonid)
include(orderdate,shipdate)
where purchaseordernumber is not null
and salespersonid is not null
建好过滤索引后,再执行上面的一段查询语句:
set statistics io on
go
set statistics time on
go
set statistics time off
select
soh.purchaseordernumber
, soh.orderdate
, soh.shipdate
, soh.salespersonID
from sales.salesorderheader as soh
where purchaseordernumber like 'Po5%'
AND soh.salespersonid is not null
执行结果返回的消息如下:
SQL Server 分析和编译时间:
CPU 时间 = 31 毫秒,占用时间 = 52 毫秒。
(250 行受影响)
表 'SalesOrderHeader'。扫描计数 1,逻辑读取 4 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
执行计划:
TM4IZ[T`JUF9~1JCIKKD2[5.jpg

通过两次查询计划以及输入输出比较,可以看出来,过滤索引可以大幅度的降低逻辑读取的次数,从而提高查询效率。

要回复问题请先登录注册