zoukankan      html  css  js  c++  java
  • 使用跟踪标记查看过滤统计信息是否被使用

        在某些情况下,表中数据较多,且分布不均匀的时候,执行计划的估计行数往往会有很大偏差,因此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.已经正确使用过滤统计信息

     

     

     

  • 相关阅读:
    每日记载内容总结33
    华为机试-尼科彻斯定理
    华为机试-求最大连续bit数
    华为机试-合法IP
    华为机试-票数统计
    华为机试-等差数列
    华为机试-自守数
    中序表达式转后序表式式
    华为机考 给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
    华为机试-求解立方根
  • 原文地址:https://www.cnblogs.com/CareySon/p/4062230.html
Copyright © 2011-2022 走看看