SE の雑記

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

拡張イベントでコマンドタイムアウトが発生したクエリを取得する

leave a comment

クエリストアによる、クエリタイムアウトしたクエリの取得 では、クエリストアの機能を使用して、コマンドタイムアウト (クエリタイムアウト) が発生したクエリの浄法を取得しました。

クエリストアが使用できない環境では拡張イベントを使用しても取得することができますので、書いておこうかと。

拡張イベントを作成する際に「因果関係の追跡」の「イベントを相互に関連付ける方法を追跡する」の設定を有効にしておきます。

image

相互の関連付けの設定を行わなくても、クエリの追跡は可能なのですが、有効になっていると情報を把握しやすくなりますので、今回は有効化しておきます。

次にイベントとして sql_batch_completed を追加します。
(イベントはストアドや RPC を取得するかのよって適宜変更してください)
この時、フィルターの条件として「result=Abort」を設定しておくことで、タイムアウトが発生し、SQL Server から見て Abort となったクエリの情報を取得することができるようになります。

image

もう一つ「attention」というイベントを追加しておきます。
クエリのタイムアウトであるコマンドタイムアウトが発生した場合、SQL Server はクエリを実行した環境から Attention のパケットを受け取りますので、このイベントもキャプチャするようにしておきます。
attention を追加する際には、グローバル フィールドで 「client_app_name」「sql_text」を追加しておくとよいかと。

image

attention が多い場合などは、追加したフィールドを使用して「特定のアプリケーション」や「特定のクエリ」の情報でフィルタリングすることでノイズとなるクエリを省くことができるようになります。

実際に取得した情報がこちらです。

image

今回は 5 秒でコマンドタイムアウトをするように設定していました。
そのため、「duration」が「4,999,530 ナノ秒 = 約 5 秒」となっていることが確認できますね。

同一の「attach_activity_id_guid」が設定されており「seq」が 2 となっている attention についても確認ができます。
イベントに相互の関連付けを行うように設定した場合は、このように、関連性のあるイベントに同一の GUID が設定されますので、どのクエリに対しての attention なのかが把握しやすくなります。

コマンドタイムアウトの設定値がわかっているのであれば、Abort したクエリの duration を確認することでも把握できると思いますが。

拡張イベントをうまく使うとこのような情報の取得もできますので、何かあった時には「事象をどのようにして捕まえるか?」を拡張イベントをベースで考えてみても良いのではないでしょうか。

Share

Written by Masayuki.Ozawa

4月 13th, 2020 at 12:04 am

Posted in SQL Server

Tagged with

Leave a Reply