我会先说我不是 DBA,只是一个试图用我们拥有的以下查询找出性能问题的开发人员。
SELECT
OCCoverID as StaffID, FullName, SUM(OCWeight) AS Num
FROM vuOCStaffAbsentExpandedMini
INNER JOIN vuStaff ON OCCoverID = StaffID
WHERE
SADate = '2019-10-4'
AND MIDent = 506
AND SASupplyID IS NULL
AND CoverStaffSupplyID IS NULL
AND StaffMIDent <> 1
GROUP BY
OCCoverID, FullName
每次执行大约需要 1 分钟,我们已经仔细检查(我们认为)所有必需的索引,通过索引调谐器运行它并且仍然存在相同的问题。以下是它创建的实际计划。
任何帮助将不胜感激,我们正在使用 sql server 2012 express
您有一个性能假脱机,可以为您的嵌套循环运算符提供数据(不适用)
......估计非常低。
现在,对于顶部(外部)输入中的每个值,表假脱机将产生一个重新绑定。对于非应用嵌套循环连接的性能假脱机,不可能倒带。
资料来源:Paul White 谈嵌套循环连接和性能假脱机
低估导致实际情况如下:
您可以通过将两个输入(计算标量和流聚合)相乘来验证假脱机输出的高行数。
515 728
(外部输入)* 168
(内部输入)=86 642 304
解决方案
首先要解决的是解决为什么估计值如此之低的问题。
您可以尝试更新视图中引用的表的统计信息。
但看起来您正在对和提供假脱机操作员的表格
LIKE
进行比较。dbo.TblOnCall
这也可以在从假脱机中获取数据的 NL 运算符上看到。
(
EXPR 1137
= 外部输入,UNION
= 内部输入)。对于长期解决方案,
我会修复这个
LIKE
比较和任何其他会严重影响您的估计的部分。我们必须查看视图才能提供最正确的查询建议。
对于临时的快速修复,您可以使用跟踪标志或查询提示禁用假脱机。
一个实现这个的例子正在运行
DBCC TRACEON(8690,-1)
(将在实例重启时删除)或者更好的是,运行查询
OPTION(QUERYTRACEON 8690)