意外とマイナーな情報なのかなと思ったので少しまとめておきたいと思います。
SQL Server 2008 以降は拡張イベントでシステムヘルス (System Health) の情報が取得されており、その中にはデッドロックンの情報も取得されています。
取得されている情報は system_health セッションの使用 が参考になるかと。
システムヘルスの情報からデッドロックを取得するための情報として、How To Monitor Deadlocks in SQL Server があります。
ここで紹介されている以下のクエリを実行するとデッドロックの情報をシステムヘルスから取得することができます。
WITH SystemHealth SELECT XEventData.XEvent.query(‘(data/value/deadlock)[1]’) AS DeadLockGraph |
実行すると以下のように XML 形式のデータを取得することができます。
ここから情報を追うことも可能なのですが、これだと少し解析がしづらいですよね。
そんな時はこの XML をファイルに保存して、拡張子を xdl に変更します。
これをダブルクリックすると、SSMS で開くことができるのですが、この状態では以下のようなエラーとなります。
ここでもう一つだけ手を加えます。
XML のルートを
<deadlock-list>
</deadlock-list>
で囲むようにします。
このように編集したファイルをダブルクリックして開くと、以下のようにプロファイラで取得することができるデッドロックグラフを作ることができます。
# 拡張イベントでも取得できますが。
デッドロックの原因が複雑化した際などは XML データの情報が大きくなることがありますので、その場合は SSMS [ツール] → [オプション] をクックし、
[クエリ結果] → [SQL Server] → [結果をグリッドに表示] の [XML データ] のサイズを変更すると途中で切れることなく情報を取得することができるようになります。
# 設定を変更した後は一度クエリエディタを開きなおす必要があります。
ちょっとした小ネタでした。
# もっとさくっとデッドロックグラフがシステムヘルスから作れた気がするのですが忘れました…。
追記
拡張イベントをファイルに出力している場合はデッドロックタブから見れました。
というか自分で書いていました…。
ブロッキングとデッドロックを後追い確認する方法
SQL Server 2008 R2 まではリングバッファとして System Health をメモリに格納していると思いますので、この場合は本投稿の情報で確認をするとよいのかもしれないですね。