前言:
从 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 是指向聚集 索引 的非聚集 索引 列。
查看更多关于第十二章SQLServer统计信息(4)在过滤索引上的统计信息的详细内容...