SQL Server で実行時に待ち時間の多いクエリを取得する場合、プロファイラや SQL Trace で Duration の多いクエリを取得することがあると思います。
SQL Server 2012 は拡張イベントを SSMS から設定できるようになっており、この拡張イベントを使用することでも待ち時間の多いクエリを取得することができます。
今回の投稿では拡張イベントを使用した待ち時間の多いクエリの取得についてまとめていきたいと思います。
■拡張イベントを使用した待ち時間の多いクエリの取得
SQL Server 2012 + SQL Server 2012 の SSMS を使用する場合、SSMS から拡張イベントを設定することができます。
SQL Server Profiler で待ち時間の多いクエリを取得する場合 [SQL:BatchCompleted] 等の項目を使用すると思いますが、拡張イベントでも対応したイベントが準備されています。
SQL Server Profiler | 拡張イベント |
SQL:StmtCompleted | sql_statement_completed |
SQL:BatchCompleted | sql_batch_completed |
SP:StmtCompleted | sp_statement_completed |
これらのイベントを使用することで拡張イベントからも待ち時間の多いクエリを取得することができます。
拡張イベントもフィルターをすることができ、duration を使用して特定の時間を経過したクエリのみを抽出することができます。
SQL Server Profiler の duration はミリ秒でしたが拡張イベントの duration はマイクロ秒で指定をします。
# 以下の画像は 5 秒の待ちとなっています。
拡張イベントはメモリに格納する ring_buffer (円環状のメモリバッファ) とファイルに格納する event_file 等を使用することができます。
対象のデータストレージを選択して、[ターゲット データの表示] をクリックすることで、データを表示することができます。
ファイルの [開く] または [拡張イベント ファイルの結合] からも拡張イベントとして取得した内容を開くことができます。
拡張イベントは SQL Serve Profiler と比較して取得できるイベントやフィールドが多いです。
また、グループ化 / 集計という操作もできますので情報を整理しやすくなっています。
SQL Trace と拡張イベントを比較すると拡張イベントの方が軽量らしいので、今後はこちらを使って状態を取得する機会が多くなってくるのかなと思います。