SQL Server 2012 の拡張イベント
拡張イベントを簡単に表せば内部の実装方法は異なりますが SQL トレースより柔軟なイベント処理システムです。また、軽量で監視に必要なリソースが少なく、SQL トレースよりシステムへのパフォーマンスの影響が少なくなっています。この拡張イベントは SQL Server 2008 で最初に実装されましたがグラフィカル ユーザー インターフェースはなく、ドキュメントも充実していないため、残念ながらあまりご存知ない方が多いのではないでしょうか。例えばデフォルト トレースのように拡張イベントの既定のセッションが SQL Server 起動時に自動で実行されていることはご存知でしょうか。この既定のセッションはデッドロックついても情報の採取が行われており、通常はトレース フラグ 1222 を設定して採取する情報と同等の情報を確認することができます。このように既定のセッションではパフォーマンスのトラブルシューティングに役立つ情報が含まれています。この既定のセッションなど拡張イベントについてご紹介するとともに SQL Server 2012 の拡張イベントについてご紹介していきたいと思います。
拡張イベントの操作
拡張イベントを使用してシステムを監視するには拡張イベントのセッションを作成する必要があります。セッションの作成時にはキャプチャするイベントやターゲットと呼ばれる出力先を指定します。次に簡単なセッションを作成する DDL の例を記載します。このDDL ではセッション名 ‘test_xesession’ のセッションを作成し、セッションには SQLのステートメントの実行が完了した時とデッドロックが発生した時のイベントをキャプチャして、イベント データをターゲットのリング バッファーに格納しています。
SQL Server 2008 R2 まではどのようなイベントがセッションを作成するときに指定できるのかは動的管理ビュー sys.dm_xe_objects を確認する必要があります。SQL Server 2012 では GUI が追加されたため動的管理ビューを参照する必要はありませんが、同様に確認することができます。
同様に指定できるターゲットも sys.dm_xe_objects を確認します。
セッションを作成する DDL ではイベントやターゲット名の前に “sqlserver” や “package0” と記述しています。これはイベントやターゲットが含まれるパッケージの名前です。パッケージの情報はsys.dm_xe_packagesを確認します。パッケージは SQL Server 2008 R2 までは 4 つのパッケージのみでしたが、SQL Server 2012 では多くのパッケージが追加されています。
提供されているパッケージの中に ”SecAudit” パッケージがありますが、この ”SecAudit” の sys.dm_xe_packages の capabilities_desc 列が ”private” となっています。これは SQL Server が内部的に使用することを表しており、ユーザーが使用することはできないパッケージです。ちなみに ”SecAudit” は SQL Server 2008 から実装された SQL Server 監査の機能で使用されます。
イベントやターゲットが含まれるパッケージは sys.dm_xe_objects の package_guid 列と sys.dm_xe_package の guid 列が同じ値のものになります。