【发布时间】:2013-06-17 22:55:20
【问题描述】:
我有一个用于 DI 报告的存储过程,其中包含使用 UNION ALL 的 62 个子查询。最近,性能从不到 1 分钟到超过 8 分钟,使用 SQL Profiler,它显示出非常高的 CPU 和读取。该过程当前已将变量设置为局部变量以防止参数嗅探。
将过程的内容作为 SELECT 语句运行,性能恢复到不到一分钟。 通过 Management Studio 中的 EXEC 调用该过程,性能非常糟糕,超过 8 分钟。 通过 EXEC 调用过程(包括 WITH RECOMPILE 命令)和性能没有提高。我运行了 DBCC FREEPROCCACHE 和 DBCC DROPCLEANBUFFERS,但仍然没有任何改善。
最后,我放弃了该程序并重新应用它,现在性能又恢复了。
谁能帮我解释一下为什么最初的步骤没有纠正程序的性能,但删除并重新应用程序却可以?
【问题讨论】:
-
运气?
DBCC FREEPROCCACHE将清除计划缓存,因此不会有任何旧计划出现。具有 62 个子查询的查询的编译时间可能很重要,因此在编译超时之前它到达的位置可能只是运气。 -
我喜欢运气并且经常帮助我。只是让上级更难解释我们如何、为什么以及如何避免或防止未来发生。将不情愿地添加删除程序作为故障排除步骤,以便在时间敏感时恢复并运行。
-
在执行计划中是“Reason For Early Termination”“超时”?
标签: sql-server performance stored-procedures