既定で提供される System_health セッション
冒頭でお話しした既定のセッションのセッション名は system_health と呼ばれています。SQL Server が起動すると自動で開始されていますので、実行中のセッションを sys.dm_xe_sessions で確認すると、system_health が確認できると思います。
system_health のセッションのターゲットに SQL Server 2008 R2 まではリング バッファーのみでした。さきほどご紹介したようにリング バッファーはメモリを使用しているため、SQL Server のサービスを停止やフェールオーバー クラスタを使用している環境でフェールオーバーが発生した場合、それまで出力されていたイベント データはなくなってしまいます。SQL Server 2012 では event_file ターゲットにも出力しています。ファイルは ログ フォルダに system_health_*.xel のファイル名で出力されています。
system_health セッションは次のような SQL Server の重大なエラーやパフォーマンスに影響するイベントをキャプチャしています。
- データベース エンジン エラーの重要度が 20 以上。
- メモリ関連のエラー(17803,701,802,8645,8651,8657,8902)
- スケジューラが応答を停止した場合
- デッドロック情報
- ロックの 30 秒以上の待機
- ラッチとその他のリソースの 15 秒以上の待機
- ログイン処理の 5 秒以上の待機
- プリエンプティブ モードでの実行で 45 秒以上の待機
- CLR のメモリ アロケーション エラー
- 以下の場合にリング バッファ(sys.dm_os_ring_buffer)にレコードを記録した場合
- メモリ関連
- スケジューラ関連
- セキュリティ関連
- 接続関連
- フェールオーバー クラスタまたは AlwaysOn Availabilty Groups の詳細な正常性チェックのシステムに関するチェックの結果
この中のロックやラッチとその他の待機は sqlols.wait_infoイベントをキャプチャしています。sqlos.wait_info イベントの列を sys.dm_xe_objcct_columns を使用して確認すると wait_type 列があります。
イベント データの wait_type の値は数値ですが、1 から 21 までがロックの種類を表しています。1 から 21 の値がどのロックの種類になるかは sys.dm_xe_map_values を確認します。sys.dm_xe_object_columns の type_name が ‘wait_types’ となっていますので、次のクエリを実行します。
このように sys.dm_xe_map_values を使用してイベント データの列値をテキストに変換することができます。また、sqlos.wait_info イベントは待機が開始した時と終了したときの 2 回のイベント データが出力されます。イベント データの opcode 列の値が 0 の場合は待機の開始時に出力されたものであり、待機時間の Duration 列は 0 となります。opcode が 1 のものは待機の終了時に出力されたものであり、Duration 列は待機していた時間 (msec) が出力されます。
また、system_health セッションを作成する DDL が <インスタンス ディレクトリ>\MSSQL\Install\u_tables.sql に含まれています。この定義を確認すると system_health でキャプチャしている待機のイベントでは、ロックやラッチなど待機の種類によって待機時間の条件が異なっています。次のセッションでは実行時間が 30 秒以上要したクエリの sqlserver.sql_statement_completed イベントをキャプチャしています。このようにイベントのキャプチャ時には WHERE 句を記述してフィルタを行うことが可能です。
ここまで Transact-SQL を使用した方法で拡張イベントの作成や作成に必要な情報の確認方法などをご紹介してきました。SQL Server 2008 R2 までは GUI もなく、今回ご紹介してきた方法でしか拡張イベントを使用する方法がありません。SQL Server 2012 ではSQL Server Management Studio 上で拡張イベントの管理が行えるようになりました。その機能についてのご紹介は次回までお待ちください。
最後に今回使用した動的管理ビューを含め拡張イベントに関連するビューをまとめておきます。