SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server 2022 の blocked_report の出力内容の強化

leave a comment

SQL Server ではブロッキング (ロック競合) 情報を取得する方法として Blocked Process Report イベント クラス の情報を拡張イベントで取得するという手法があります。

SQL Server 2022 では、この情報に出力される内容が強化されていることに先日気づきました。

ブロッキングのコールスタックの出力内容の強化

拡張イベントのグローバルフィールドでは「callstack」を取得することができます。

image

グローバルフィールドブロッキングの情報を取得するためのイベントである「blocked_process_report」でも取得することができるのですが、blocked_process_report のグローバルフィールドで取得できる情報は有益な情報と名貼っていません。

blocked process threshold (サーバー構成オプション) に記載されてますが、blocked_process_report の情報はロックモニター経由で取得が行われています。

そのため、グローバルフィールドの callstack を確認すると次のような情報になります。

image

拡張イベント自身のコールスタックとしては前述のとおりロックモニターの情報が出力されています。

SQL Server 2022 でも拡張イベントの callstack はロックモニターの情報となるのですが、拡張イベント内のブロッキングの詳細の情報となる「blocked_process」内の出力情報が強化されています。

SQL Server 2022 では、blocked_process 内に「stackFrames」という情報が追加されました。

この情報は「blocked-process」「blocking-process」の両セクションに出力が行われており、ブロッキングが発生した際の各スレッドのコールスタックが出力されるようになったようです。

実際にコールスタックを解決したものが以下になります。

image

従来までの SQL Server では、コールスタックはロックモニターの情報しか取得されていませんでしたが、SQL Server 2022 では、ブロッカーとなったスレッド / ブロックされているスレッドのコールスタックが出力されるようになりました。

コールスタックの情報となるため、スタックを読み解いてどのような処理が行われたのかを把握する必要がありますが、クエリ内のどのような処理で取得されたロック間で競合が発生したのかを推測するための情報としては有益なものとなります。

Share

Written by Masayuki.Ozawa

11月 6th, 2023 at 9:41 am

Leave a Reply