拡張イベント パッケージ

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

パッケージは、SQL Server データベース エンジン 拡張イベント オブジェクトを格納するコンテナーです。 たとえば、次のパッケージは、拡張イベントをサポートするすべてのデータベース エンジンに存在します。

  • package0 - 拡張イベント システム オブジェクト。 既定のパッケージです。
  • sqlserver - データベース エンジンに関連するオブジェクト
  • sqlos - オペレーティング システム (SQLOS) 関連オブジェクト。

Note

パッケージは SecAudit 監査機能によって内部的に使用されます。 このパッケージ内のオブジェクトは、拡張イベントのデータ定義言語 (DDL) を通じて提供されることはありません。

パッケージは、名前、GUID、および、パッケージを含んでいるバイナリ モジュールで識別されます。 モジュールは、実行可能ファイルかダイナミック リンク ライブラリ (DLL) です。 詳細については、「sys.dm_xe_packages 」を参照してください。

パッケージには、次のいずれかまたはすべてのオブジェクトを含めることができます。この点については、この記事の後半で詳しく説明します。

  • イベント
  • 目標値
  • アクション
  • 種類
  • 述語
  • Maps

1 つのイベント セッションに異なるパッケージのオブジェクトを混在させることもできます。 詳細については、拡張イベントセッションに関する記事を参照してください。

パッケージの内容

次の図は、パッケージに存在できるオブジェクトを示しています。

Diagram that shows the relationship of a module, packages, and objects.

イベント

イベントは、プログラム (SQL Server など) の実行パスにおける、監視対象となる地点です。 イベントは、監視対象の地点まで到達したという事実のほか、イベントが生成された時点の状態情報を伴って発生します。

イベントは、トレースを行う目的、またはアクションのトリガーを起動する目的でのみ使用できます。 これらのアクションは同期的に実行される場合と非同期的に実行される場合とがあります。

Note

イベントは、その発生に呼応して起動されるアクションについての情報は一切持ちません。

パッケージが拡張イベントに登録された後で、パッケージ内の一連のイベントを変更することはできません。

すべてのイベントは、その内容を定義するバージョン管理されたスキーマを持ちます。 このスキーマは、適切に定義された型を持つイベント列で構成されます。 特定の型のイベントは、常にそのデータを、スキーマで指定された順序とまったく同じ順序で提供する必要があります。 ただし、イベント ターゲットは、必ずしも提供されたすべてのデータを利用する必要はありません。

イベントの分類

拡張イベントには、Event Tracing for Windows (ETW) に似たイベント分類モデルが使用されます。 分類には、チャネルとキーワードという 2 つのイベント プロパティが使用されます。 これらのプロパティを使用することにより、拡張イベントを ETW やそのツールと連携させることができます。

チャネルは、イベントの対象ユーザーを識別します。 次の表でこれらのチャネルについて説明します。

任期 定義
管理者 管理イベントの対象は、主にエンド ユーザー、管理者、およびサポートです。 管理チャネルのイベントは、管理者が対応できる明確な解決策が存在する問題を示します。 たとえば、アプリケーションが接続できなかった場合に発生するイベントなどがあります。 これらのイベントには、解説が付属するか、問題の解決方法をユーザーに伝えるメッセージが関連付けられています。
運用時 運用イベントは、問題や事象の分析および診断のために使用されます。 問題や事象に応じたツールまたはタスクを起動する目的で使用できます。
分析 非常に多くの分析イベントが公開されています。 プログラムの動作を説明するもので、主にパフォーマンス調査に用いられます。
デバッグ デバッグ イベントは、開発者がデバッグ時に問題を主に診断する目的でのみ使用されます。

デバッグ チャネルのイベントでは、実装固有の内部状態データが返されます。 スキーマ、およびこのイベントによって返されるデータは、データベースエンジン の将来のバージョンで変更または無効化される可能性があります。

キーワードはアプリケーション固有の情報です。キーワードを使用すると、関連するイベントをより詳細に分類でき、セッションで使用するイベントの指定や取得を簡単に行うことができます。 次のクエリを使用すると、キーワード情報を取得できます。

SELECT map_value AS Keyword
FROM sys.dm_xe_map_values
WHERE name = 'keyword_map';

目標値

ターゲットは、イベントのコンシューマーです。 ターゲットは、イベントを開始したスレッド上で同期的に、またはシステムによって提供されたスレッド上で非同期的に、イベントを処理します。 拡張イベントには、複数のターゲットの種類が用意されており、イベント出力を転送する目的で必要に応じて使用できます。 詳細については、「拡張イベントのターゲット」を参照してください。

イベント セッションにターゲットを追加するには、 ADD TARGET ページを使用します。

アクション

アクションは、プログラムがイベントに呼応して実行する特定の (または一連の) 応答です。 アクションはイベントに関連付けられます。各イベントには、それぞれ独自のアクションが関連付けられる場合もあります。

Note

特定のイベント セット用のアクションを、その他のイベントに関連付けることはできません。

イベントに関連付けられたアクションは、そのイベントが発生したスレッドで同期的に呼び出されます。 アクションの種類と機能は多岐にわたります。 アクションを使ってできることの例を次に示します。

  • プロセス ダンプをキャプチャする
  • 変更可能なストレージを使って状態情報をローカル コンテキストに保存する。
  • イベント データを集計する。
  • イベント データにデータを追加する。

アクションを使用する一般的な例としては、以下が挙げられます。

  • イベントを発生させたスレッドによって実行されているクエリの SQL テキストを収集します
  • クエリ プラン ハンドル、クエリ ハッシュ、クエリ プラン ハッシュを収集します
  • クライアント ホスト名、プリンシパル名、接続 ID など、イベントを発生させるセッションの属性を収集します。
  • 現在の呼び出し履歴の収集
  • 特定のエラーが発生したときにプロセス ダンプをキャプチャする

この句を ACTION 使用して、イベント セッションにアクションを追加します。

述語

述語は、処理するイベントを評価するために使用される一連の論理規則です。 拡張イベントのユーザーは、特定の条件に基づいてイベント データを選択的にキャプチャできます。

述語ではデータをローカル コンテキストに保存できます。そのデータを使って、 n 分ごと、またはイベントが n 回発生するたびに true を返す述語を作成できます。 さらに、このローカル コンテキストの格納域を使用して述語を動的に更新することにより、イベントに同様のデータが格納されていた場合に、それ以上のイベントの発生を抑制することもできます。

述語には、イベント固有のデータに加え、スレッド ID などのコンテキスト情報を取得する機能があります。 述語は完全なブール式として評価され、式全体が false であると判明した時点ですぐに結果を返すことができます。

Note

二次的に作用する述語は、先行する述語が false と判定された場合、評価されない可能性があります。

WHERE 句を 使用して、イベント セッションに述語を追加します。

種類

パッケージでは、各 Extended Events オブジェクトに型があります。 次の種類が使用されています。

  • action
  • event
  • message
  • pred_compare
  • pred_source
  • target
  • type

詳細については、「sys.dm_xe_objects」を参照してください。

Maps

内部値はマップ テーブルによって文字列に対応付けられます。これにより、ユーザーは、その値が何を表しているのかを知ることができます。 内部値について単に数値を取得できるだけでなく、意味のある説明を取得できます。 次のクエリは、マップ値の取得方法を示しています。

SELECT map_key, map_value
FROM sys.dm_xe_map_values
WHERE name = 'lock_mode';

以下は前述のクエリの出力結果です。

map_key map_value
0 NL
1 SCH_S
2 SCH_M
3 S
4 U
5 X
6 IS
7 IU
8 IX
9 SIU
10 SIX
11 UIX
12 BU
13 RS_S
14 RS_U
15 RI_NL
16 RI_S
17 RI_U
18 RI_X
19 RX_S
20 RX_U
21 LAST_MODE

このテーブルを例にして、 lock_modeという名前のカラムがあり、その値が5だと仮定します。 このテーブルによると、5は、ロックタイプがExclusive排他的であることを意味する X にマップすることを示している。