我有一个用于 DI 报告的存储过程,其中包含使用 UNION ALL 的 62 个子查询。最近,性能从不到 1 分钟到超过 8 分钟,使用 SQL Profiler,它显示出非常高的 CPU 和读取。该过程当前已传入设置为局部变量的变量以防止参数嗅探。
将该过程的内容作为 SELECT 语句运行,性能恢复到不到一分钟。通过 Management Studio 中的 EXEC 调用该过程,性能非常糟糕,超过 8 分钟。通过 EXEC 调用过程(包括 WITH RECOMPILE 命令)和性能没有提高。我运行了 DBCC FREEPROCCACHE 和 DBCC DROPCLEANBUFFERS,但仍然没有任何改善。
最后,我放弃了该程序并重新应用它,现在性能又恢复了。
谁能帮我解释一下为什么最初的步骤没有纠正程序的性能,但删除并重新应用程序可以吗?