我可以让 SSMS 在执行计划窗格中显示实际查询成本吗?

Aak*_*shM 8 performance sql-server ssms execution-plan query-performance

我正在修复 SQL Server 中多语句存储过程的性能问题。我想知道我应该花时间在哪一部分上。

我从如何阅读查询成本中了解到,它总是一个百分比吗?即使当 SSMS 被告知包括实际执行计划时,“查询成本(相对于批次)”数字仍然基于成本估算,这可能与实际情况相差甚远

我从测量查询性能:“执行计划查询成本”与“所用时间”中了解到,我可以用SET STATISTICS TIME语句包围存储过程的调用,然后我将在Messages窗格中获得如下列表:

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 1 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

[etc]

 SQL Server Execution Times:
   CPU time = 187 ms,  elapsed time = 206 ms.
Run Code Online (Sandbox Code Playgroud)

每个语句都有一个输出消息。

我可以“轻松”(虽然不方便)将时间统计输出与 Execution plan 窗格中的逐个语句执行计划相关联,方法是对它们进行计数:第四条SQL Server Execution Times消息输出对应Query 4于 Execution plan 窗格中,依此类推。

但是有更好的方法吗?

Aar*_*and 8

我不知道有什么方法可以在 Management Studio 的计划中执行此操作,但这是免费的SentryOne 计划资源管理器在您从工具中生成实际计划时将为您做的众多事情之一- 它包括所有每个语句的运行时指标。


wBo*_*Bob 5

一种很好的方法是使用 Profiler。在开发或测试盒上设置问题 proc 的“再现”,即使用参数调用 proc 的示例。然后使用 Profiler,使用 TSQL_SPs 模板或从空白模板创建跟踪,添加 SP:StmtCompleted 事件。如果尚不可用,请添加 Duration、Reads、Writes 和 CPU 列。向 SPID 上的跟踪添加筛选器(您应该从 Management Studio 中了解)。您还可以向 Duration 添加过滤器(例如,大于 1000 = 大于 1 秒)。

您可以在 Profiler 中运行跟踪,尽管存在开销(不要在生产设备上执行此操作)或导出定义并创建服务器端跟踪。Profiler 开销在专用开发或测试盒上并不是什么大问题。

运行 proc 并让它完成。此时您还可以收集实际执行计划。

停止跟踪并打开文件,您应该会看到 proc 的一行一行细分,包括每个步骤的时间。我发现这比确定瓶颈的计划更有用,尽管该计划在查看要调整的相关部分时会派上用场。

HTH