在2008之前我們分析死鎖需要用profiler trace或者trace flag 1222,1204.在2008中引入了一個新功能:Extended Events(擴展事件),可以監控Deadlock事件,並且性能更好。
而且2008自帶了一個默認擴展事件會話system_health,如果你運行在2008或者之上版本可以執行下面查詢:
select * from sys.dm_xe_sessions
其中system_health會收集很多重要的信息,之後出現問題可以用來分析。system_health會話收集信息參考http://msdn.microsoft.com/en-us/library/ff877955.aspx。其中一項內容是:Any deadlocks that are detected.
也就是SQL Server會自動收集deadlock的信息,並記錄在ring_buffer。通過分析ring_buffer我們不需要使用profiler 或者Trace Flag就可以找到deadlock原因。
使用下面的代碼查看deadlock_report的內容:
SELECT xed.value('@timestamp', 'datetime') as Creation_Date, xed.query('.') AS Extend_Event FROM ( SELECT CAST([target_data] AS XML) AS Target_Data FROM sys.dm_xe_session_targetsAS xt INNERJOIN sys.dm_xe_sessions AS xs ONxs.address = xt.event_session_address WHERE xs.name = N'system_health' ANDxt.target_name =N'ring_buffer') AS XML_Data CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData(xed) ORDER BY Creation_Date DESC
默認的system_health在不影響性能的情況下將一些重要事件記錄下來,方便我們後期做分析,這是一個非常好的功能。避免了之前可能由於沒有及時監控而找不到原因的狀況。