準確度量存儲過程的性能(完成時間)的最佳方法是什麼?準確測量存儲過程的性能
我即將開始嘗試優化怪物存儲過程,並且爲了正確確定我的調整是否有任何效果,我需要一些比較前後的內容。
我的想法而已:
- 尋找查詢執行時間SQL Management Studio中:不是很準確,但很方便。
- 在存儲過程中添加計時器並打印已用時間:添加類似這樣的調試代碼。
- 使用SQL Server Profiler,添加篩選器以僅針對我的存儲過程。這是迄今爲止我的最佳選擇。
還有其他的選擇嗎?
準確度量存儲過程的性能(完成時間)的最佳方法是什麼?準確測量存儲過程的性能
我即將開始嘗試優化怪物存儲過程,並且爲了正確確定我的調整是否有任何效果,我需要一些比較前後的內容。
我的想法而已:
還有其他的選擇嗎?
Profiler是最可靠的方法。您也可以使用SET STATISTICS IO ON
和SET STATISTICS TIME ON
,但這些不包括標量UDF的全部影響。
您還可以打開SSMS中的「包含客戶端統計信息」選項,以獲得最近10次運行的性能概覽。
定時器/調試選項的一個可能的改進是將結果存儲在表中。通過這種方式,您可以使用SQL查詢對產生的時序數據進行切片,而不是直觀地解析調試輸出。
我不同意。在除數據庫服務器以外的服務器上運行Profiler,並將跟蹤結果存儲在文件中。這樣你就不會加載SQL Server並影響跟蹤結果(假設你試圖做到準確)。 – Tony 2011-01-21 09:18:55
這非常聰明,甚至可能有理由用一些調試代碼亂拋垃圾。謝謝你的提示。 :) – 2011-01-21 09:20:05
有很多詳細的性能信息,在DMV dm_exec_query_stats
DECLARE @procname VARCHAR(255)
SET @procname = 'your proc name'
SELECT * FROM sys.dm_exec_query_stats WHERE st.objectid = OBJECT_ID(@procname)
這會給你累積的性能數據,每個高速緩存的語句執行計數。
您可以使用DBCC FREEPROCCACHE
來重置計數器(不要在生產系統中執行此操作,因爲會清除所有緩存的查詢計劃)。
您可以通過擴展此查詢獲取每個語句的查詢計劃:
SELECT SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) [sub_statement]
,*, CONVERT(XML, tqp.query_plan)
FROM sys.dm_exec_query_stats qs CROSS APPLY
sys.dm_exec_sql_text(sql_handle) st CROSS APPLY
sys.dm_exec_query_plan(plan_handle) qp CROSS APPLY
sys.dm_exec_text_query_plan(plan_handle, statement_start_offset, statement_end_offset ) tqp
WHERE st.objectid = OBJECT_ID(@procname)
ORDER BY statement_start_offset, execution_count
這會給你哪個SP的部分成效不好的指針,以及 - 如果包括執行計劃 - 爲什麼。
你想確保你正在進行公平測試,即比較喜歡與喜歡。考慮使用冷高速緩存運行測試,以便每次執行測試時強制執行IO子系統的存儲過程執行。
是的,你捕獲的IO,CPU,持續時間等 – gbn 2011-01-21 09:18:43