在某些状况下,表中数据较多,且分布不均匀的时候,执行计划的估计行数每每会有很大误差,所以SQL Server 2008引入了过滤统计信息,意味着只对表中的特定数据计算统计信息。那么在调优查询的过程当中如何知道语句是否使用了过滤统计信息呢?SQL Server提供了一个隐藏的跟踪标记来支持这一过程。下面Demo能够展现如何使用该跟踪标记。app
咱们首先对AdventureWorks的SalesOrderDetail作一个简单的查询,代码如代码清单1所示。spa
SELECT DISTINCT
OrderQty,ProductID,SpecialOfferID
FROM [AdventureWorks].[Sales].[SalesOrderDetail] AS c
WHERE [c].OrderQty = 1
AND [c].ProductID = 800
AND [c].SpecialOfferID = 1
代码清单1.一个简单的查询code
咱们来看对应的执行计划,如图1所示。blog
图1.估计的行数为264.474实际的行数为328索引
所以,针对该特定查询,咱们建立过滤统计信息,代码如代码清单2所示。ip
CREATE STATISTICS [filter_statistics]
ON [Sales].[SalesOrderDetail] (OrderQty,ProductID)
WHERE SpecialOfferID = 1;
代码清单2.建立过滤统计信息ci
咱们再来看执行计划,如图2所示。get
图2.应用过滤索引后估计的行数更准了it
那么,在调优语句的时候,咱们想知道该语句是否使用了该过滤统计信息,则能够经过跟踪标记9204来查看,代码如代码清单3所示。io
SELECT DISTINCT
OrderQty,ProductID,SpecialOfferID
FROM [AdventureWorks].[Sales].[SalesOrderDetail] AS c
WHERE [c].OrderQty = 1
AND [c].ProductID = 800
AND [c].SpecialOfferID = 1
OPTION ( QUERYTRACEON 3604, QUERYTRACEON 9204);
代码清单3.使用跟踪标记9204
经过图3返回的信息咱们看到过滤统计信息已经被正确使用。
图3.已经正确使用过滤统计信息