寻求帮助来解决 EDW 加载过程中的执行计划回归问题。今天开始在每天运行且没有出现任何问题的 SP 中出现这种情况;没有任何代码更改或大量数据更改可能导致此问题。我已经追踪到一个如下所示的 SQL:
SELECT ..
FROM TABLE_A A
WHERE NOT EXISTS(SELECT .. FROM TABLE_B B
WHERE A.COLUMN_1=B.COLUMN_1
AND A.COLUMN_2=B.COLUMN_2)
检查上面 SELECT 的执行计划,它显示哈希匹配(左反半连接),估计行数为 1,而实际上它将返回超过 1000000 行。显然,错误的估计会影响计划的下游部分,上面 SELECT 的结果与其他表连接,并且查询永远不会完成。
寻找有关如何解决此问题的建议。理想情况下,希望确定一个不涉及 SQL 更改的短期修复,即操作统计数据、索引等,以减少所需的回归测试量。已尝试对两个表上的 COLUMN_1、COLUMN_2 进行多列统计 - 没有帮助。
这是在 SQL Server 2016 SP3 中执行的。
如果直到今天为止都运行良好,没有任何问题,并且没有已知的原理图更改,请尝试通过执行以下两件事之一来破坏计划 -
首先你可以尝试重新编译存储过程 -
EXEC sp_recompile N'schema.procedure';
或者如果您知道的话,您可以找到回归查询并通过sql文本将其从计划缓存中删除-
SELECT p.plan_handle
, t.text
FROM sys.dm_exec_cached_plans AS p
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t
WHERE t.text LIKE '%textinyourquery%'
ORDER BY t.text;
DBCC FREEPROCCACHE(plan_handle_from_above_query);