时间:2021-07-01 10:21:17 帮助过:39人阅读
前言: 从 2008 开始,引入了一个增强非聚集 索引 的新功能—— 过滤 索引 ( filter index ),可以使用带有 where 条件的语句来创建非聚集 索引 , 过滤 掉不需要的数据,降低 索引 的维护开销和存储空间,提高查询性能。 准备工作: 在 AdventureWorks201
从2008开始,引入了一个增强非聚集索引的新功能——过滤索引(filter index),可以使用带有where条件的语句来创建非聚集索引,过滤掉不需要的数据,降低索引的维护开销和存储空间,提高查询性能。
在AdventureWorks2012上,有一个Production.WorkOrder表,将使用这个表来做演示。
1、 创建一个非聚集索引在Production.WorkOrder列:
CREATE INDEX idx_WorkOrder_ScrapReasonID ON Production.WorkOrder(ScrapReasonID) GO
2、 创建一个非聚集索引会自动更新对应的统计对象:
DBCC SHOW_STATISTICS('Production.WorkOrder',IX_WorkOrder_ScrapReasonID) GO
3、 结果如下:
4、 查看All denisty列,现在删掉之前的索引,并创建一个过滤索引:
DROP INDEX IX_WorkOrder_ScrapReasonID ON Production.WorkOrderGO CREATE INDEX IX_WorkOrder_ScrapReasonID ON Production.WorkOrder(ScrapReasonID)WHERE ScrapReasonID IS NOT NULL GO
5、 再次执行并查看All density列,最后删除这个索引:
DBCC SHOW_STATISTICS('Production.WorkOrder',IX_WorkOrder_ScrapReasonID) GO DROP INDEX IX_WorkOrder_ScrapReasonID ON Production.WorkOrder GO
6、 结果如下:
从上面的两个图中对比结果可以知道,第一个结果集,在row sampled列是不同的,第一个是72591,第二个是729,相差了接近100倍,在Filter Expression列,一个是null一个是有值。
在All density列,第一个显示的是ScriptReasonID列,这个没有什么明显的差别。但是第二个就有比较大的差异。因为ScriptReasonID是指向聚集索引的非聚集索引列。