當我進行查詢效能疑難排解時,閱讀執行計畫並查看sys.dm_os_wait_stats DMV,
並分析該查詢到底在等什麼,永遠都是我查詢效能疑難排解的第一步,
但針對個別session分析到底在等什麼,也是我目前最痛的地方。
sys.dm_os_wait_stats是整個SQL Server執行個體累積彙總資料,
並無法取得每一個session當下wait統計資料,
但分析個別session等待統計資料才算有真正活在真實世界,
也因如此,SQL2016新增sys.dm_exec_session_wait_stats DMV來改善查詢效能疑難排解效率,
該DMV資料會隨session生命週期自動更新或清空,
例如session關閉並有一新session重覆使用相同session ID,
或是使用connection pooling發生session重新啟動時。
現在我來測試看看,session等待統計資料是否會影響sys.dm_os_wait_stats。
SELECT ROW_NUMBER() OVER ( PARTITION BY ReferenceOrderID ORDER BY ReferenceOrderID )
FROM Production.TransactionHistory
WHERE TransactionType LIKE '%s%'
GROUP BY ReferenceOrderID
--查詢session ID=55等待統計資料
SELECT *
FROM sys.dm_exec_session_wait_stats
WHERE session_id = 55
Note:當關閉session後,該session等待統計資料立刻清空。
--join dm_os_wait_stats
SELECT OS.* ,
sessionWS.Session_Id ,
sessionWS.waiting_tasks_count ,
sessionWS.wait_time_ms ,
sessionWS.max_wait_time_ms ,
sessionWS.signal_wait_time_ms
FROM sys.dm_os_wait_stats OS with(nolock)
join sys.dm_exec_session_wait_stats sessionWS with(nolock) on OS.wait_type = sessionWS.wait_type
WHERE sessionWS.session_id = 54
可以看到整個SQL Server和個別session等待統計資料分開儲存。
--清空dm_os_wait_stats
DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR);
GO
Note: DBCC SQLPERF 並無法清空sys.dm_exec_session_wait_stats
清空sys.dm_os_wait_stats完全不會影響sys.dm_exec_session_wait_stats資料,
資料果然完全依賴session生命週期。
Enjoy SQL Server 2016
參考