我可以讓 SSMS 在執行計劃窗格中向我顯示實際查詢成本嗎?
我正在修復 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.
每個語句都有一個輸出消息。
我可以“輕鬆”(雖然不方便)將時間統計輸出與“執行計劃”窗格中的逐語句執行計劃相關聯,方法是對它們進行計數:第四條
SQL Server Execution Times
消息輸出對應Query 4
於“執行計劃”窗格中的輸出,依此類推。但是有更好的方法嗎?
我不知道在 Management Studio 的計劃中執行此操作的方法,但這是免費的SentryOne 計劃資源管理器在您從工具中生成實際計劃時將為您做的許多事情之一 - 它包括所有每個語句的執行時指標。
一種很好的方法是使用 Profiler。在開發或測試盒上設置問題過程的“再現”,即使用參數對過程進行範例呼叫。然後使用 Profiler,使用 TSQL_SPs 模板創建跟踪,或從空白模板添加 SP:StmtCompleted 事件。如果尚不可用,請添加 Duration、Reads、Writes 和 CPU 列。在您的 SPID 上的跟踪中添加一個過濾器(您應該從 Management Studio 中知道)。您還可以在 Duration 中添加一個過濾器(例如,大於 1000 = 大於 1 秒)。
您可以在 Profiler 中執行跟踪,儘管存在成本(不要在生產機器上執行此操作),也可以導出定義並創建伺服器端跟踪。Profiler 的成本在專用的開發或測試盒上並不是什麼大問題。
執行 proc 並讓它完成。您也可以在此時收集實際執行計劃。
停止跟踪並打開文件,您應該會看到 proc 的逐行細分,包括每個步驟的時間安排。我發現這比辨識瓶頸的計劃更有用,儘管該計劃在查看相關部分進行調整時會派上用場。
高溫高壓