使用跟踪标记查看过滤统计信息是否被使用

 在某些情况下,表中数据较多,且分布不均匀的时候,执行计划的估计行数往往会有很大偏差,因此SQL Server 2008引入了过滤统计信息,意味着只对表中的特定数据计算统计信息。那么在调优查询的过程中如何知道语句是否使用了过滤统计信息呢?SQL Server提供了一个隐藏的跟踪标记来支持这一过程。下面Demo可以展示如何使用该跟踪标记。

 

    我们首先对AdventureWorks的SalesOrderDetail做一个简单的查询,代码如代码清单1所示。

SELECT DISTINCT
OrderQty,ProductID,SpecialOfferID
FROM [AdventureWorks].[Sales].[SalesOrderDetail] AS c
WHERE [c].OrderQty = 1
AND [c].ProductID = 800
AND [c].SpecialOfferID = 1

代码清单1.一个简单的查询

 

    我们来看对应的执行计划,如图1所示。

    image

    图1.估计的行数为264.474实际的行数为328

 

    因此,针对该特定查询,我们创建过滤统计信息,代码如代码清单2所示。

CREATE STATISTICS [filter_statistics]
ON [Sales].[SalesOrderDetail] (OrderQty,ProductID)
WHERE SpecialOfferID = 1;

代码清单2.创建过滤统计信息

 

    我们再来看执行计划,如图2所示。

    image

    图2.应用过滤索引后估计的行数更准了

 

    那么,在调优语句的时候,我们想知道该语句是否使用了该过滤统计信息,则可以通过跟踪标记9204来查看,代码如代码清单3所示。

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返回的信息我们看到过滤统计信息已经被正确使用。

image

图3.已经正确使用过滤统计信息

https://blogs.msdn.microsoft.com/apgcdsd/2012/11/27/553/

 

posted @   VicLW  阅读(209)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示