执行计划百分比加起来不是 100%

IT *_*her 6 sql-server ssms execution-plan sql-server-2008-r2

我指的是 SQL Server 查询执行计划来获取查询成本,然后通过查看计划来优化所需的东西。

但单个查询成本的总和超过 100%。

这是我的查询:

DECLARE @date SMALLDATETIME

SELECT Reffd AS NAME
    ,(
        SELECT (
                (
                    SELECT count(*)
                    FROM [cal_reg].[dbo].[customer]
                    WHERE upper(Reffd) = upper(main.reffd)
                        AND cast(DATE AS SMALLDATETIME) = @date
                    ) + (
                    SELECT count(*)
                    FROM [cal_reg].[dbo].[rep]
                    WHERE upper(Reffd) = upper(main.Reffd)
                        AND cast(DATE AS SMALLDATETIME) = @date
                    )
                )
        ) AS Completed
    ,(
        SELECT (
                (
                    SELECT count(*)
                    FROM [cal_reg].[dbo].[customer]
                    WHERE upper([call Attnd]) = upper(main.[Reffd])
                        AND cast(DATE AS SMALLDATETIME) = @date
                    ) + (
                    SELECT count(*)
                    FROM [cal_reg].[dbo].[rep]
                    WHERE upper([Call Attnd]) = upper(main.reffd)
                        AND cast(DATE AS SMALLDATETIME) = @date
                    )
                )
        ) AS Attended
    ,(
        SELECT (
                (
                    SELECT (
                            (
                                SELECT count(*)
                                FROM [cal_reg].[dbo].[customer]
                                WHERE upper(Reffd) = upper(main.reffd)
                                    AND cast(DATE AS SMALLDATETIME) = @date
                                ) + (
                                SELECT count(*)
                                FROM [cal_reg].[dbo].[rep]
                                WHERE upper(Reffd) = upper(main.Reffd)
                                    AND cast(DATE AS SMALLDATETIME) = @date
                                )
                            )
                    )
                ) + (
                SELECT (
                        (
                            SELECT count(*)
                            FROM [cal_reg].[dbo].[customer]
                            WHERE upper([call Attnd]) = upper(main.[Reffd])
                                AND cast(DATE AS SMALLDATETIME) = @date
                            ) + (
                            SELECT count(*)
                            FROM [cal_reg].[dbo].[rep]
                            WHERE upper([Call Attnd]) = upper(main.reffd)
                                AND cast(DATE AS SMALLDATETIME) = @date
                            )
                        )
                )
        ) AS Total
    ,'' AS f6row
    ,'' AS f8row
FROM [cal_reg].[dbo].[customer] AS main
WHERE cast(DATE AS SMALLDATETIME) = @date
    AND upper(reffd) IN (
        SELECT upper(shname)
        FROM common.dbo.Password_table
        )
GROUP BY reffd
Run Code Online (Sandbox Code Playgroud)

为此,我总共得到了 104%,如下所示:

在此处输入图片说明 + 在此处输入图片说明

我的问题是有可能解决超过 100% 的成本错误,还是有任何其他方法可以告诉我的查询正在有效运行?

Kin*_*hah 9

执行计划中的操作员成本总和超过 100% 是一个已知错误,并按设计关闭

Microsoft 于 2010 年 11 月 17 日下午 5:28 发布

感谢您花时间提交此观察结果和简单的重现。您观察到的奇怪的成本百分比值是查询计划的特定结构的产物,这有点令人困惑,但最终是有意义的。它们不会以任何方式对查询的运行产生不利影响。

连接运算符有两个子项 - 表扫描。然而,服务器预计不需要执行第二次表扫描。这是因为它希望从第一次表扫描中找到满足查询“存在”部分的行。因此,在计算以串联为根的子树的总成本时,它不包括第二次表扫描的成本。然而,它仍然估计并报告第二次表扫描的成本,管理工具将其计算为总查询成本的百分比,就好像它将被执行一样。

在这种情况下,当然有必要运行第二个表扫描,因为第一个是空的。然而,引擎基于保守的假设运行,即始终至少有一行(可能仅在编译查询后添加)。

坎贝尔
SQL 开发

Aaron Bertrand 提交了一个类似的错误 - SSMS:执行计划有时会超过 100%

Microsoft 于 2008 年 5 月 28 日上午 11:58 发布

再次感谢您提请我们注意这一点。这种异常出现在存在“行目标”和连接运算符的情况下。行目标是指当不需要子树(可能是整个查询)返回所有可能的行时的术语。尽管还有其他原因,但当查询具有“top”子句时,最常发生这种情况。出现异常是因为我们不希望执行 Concatenation 的第二个孩子(因为我们希望第一个孩子提供所有必需的行)。这些额外的孩子需要假设他们返回单行。唯一的选择是给他们 0 成本,这将修复异常,但可能会造成其他混乱,并导致优化器不关心计划 - 我们不想这样做以防万一它们被执行。

Campbell Fraser,SQL 开发。

如果您想了解计划成本核算的工作原理,保罗·怀特 (Paul White) 在这里进行了最佳解释。

来自查询处理器团队 -这个成本是多少?

提高性能的一般准则 -

  • 拥有适当的索引和最新的统计数据。
  • 获取仅需要的数据以及相关列。
  • 有适当的 schema.table 和适当的索引和数据类型
  • 使用统计时间、更改前后的 IO 来衡量增益。
  • 从本网站的专家那里获得帮助/指导:-)

这就是我使用SQL Sentry 的免费计划资源管理器的原因