[SQL SERVER]SQL2016-取得個別session等待統計資料

當我進行查詢效能疑難排解時,閱讀執行計畫並查看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

 

 

參考

sys.dm_exec_session_wait_stats (Transact-SQL)