SQL Server ではブロッキング (ロック競合) 情報を取得する方法として Blocked Process Report イベント クラス の情報を拡張イベントで取得するという手法があります。
SQL Server 2022 では、この情報に出力される内容が強化されていることに先日気づきました。
ブロッキングのコールスタックの出力内容の強化
拡張イベントのグローバルフィールドでは「callstack」を取得することができます。
グローバルフィールドブロッキングの情報を取得するためのイベントである「blocked_process_report」でも取得することができるのですが、blocked_process_report のグローバルフィールドで取得できる情報は有益な情報と名貼っていません。
blocked process threshold (サーバー構成オプション) に記載されてますが、blocked_process_report の情報はロックモニター経由で取得が行われています。
そのため、グローバルフィールドの callstack を確認すると次のような情報になります。
拡張イベント自身のコールスタックとしては前述のとおりロックモニターの情報が出力されています。
SQL Server 2022 でも拡張イベントの callstack はロックモニターの情報となるのですが、拡張イベント内のブロッキングの詳細の情報となる「blocked_process」内の出力情報が強化されています。
SQL Server 2022 では、blocked_process 内に「stackFrames」という情報が追加されました。
この情報は「blocked-process」「blocking-process」の両セクションに出力が行われており、ブロッキングが発生した際の各スレッドのコールスタックが出力されるようになったようです。
実際にコールスタックを解決したものが以下になります。
従来までの SQL Server では、コールスタックはロックモニターの情報しか取得されていませんでしたが、SQL Server 2022 では、ブロッカーとなったスレッド / ブロックされているスレッドのコールスタックが出力されるようになりました。
コールスタックの情報となるため、スタックを読み解いてどのような処理が行われたのかを把握する必要がありますが、クエリ内のどのような処理で取得されたロック間で競合が発生したのかを推測するための情報としては有益なものとなります。