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% 的成本错误,还是有任何其他方法可以告诉我的查询正在有效运行?
执行计划中的操作员成本总和超过 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) 在这里进行了最佳解释。
来自查询处理器团队 -这个成本是多少?
提高性能的一般准则 -
这就是我使用SQL Sentry 的免费计划资源管理器的原因