次の方法で共有


SQL Server 拡張イベント パッケージ

パッケージとは、SQL Server 拡張イベント オブジェクトのコンテナーです。拡張イベント パッケージには、次の 3 種類があります。

  • package0 : 拡張イベント システム オブジェクト。既定のパッケージです。

  • sqlserver : SQL Server 関連オブジェクト。

  • sqlos : SQL Server オペレーティング システム (SQLOS) 関連オブジェクト。

パッケージは、名前、GUID、および、パッケージを含んでいるバイナリ モジュールで識別されます。詳細については、「sys.dm_xe_packages (Transact-SQL)」を参照してください。

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

  • イベント

  • ターゲット

  • アクション

  • 述語

  • マップ

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

パッケージの内容

次の図は、パッケージ内に存在することのできるオブジェクトを示しています。これらは、モジュール内に格納されます。モジュールは、実行可能ファイルかダイナミック リンク ライブラリ (DLL) です。

モジュール、パッケージ、およびオブジェクトの関係

イベント

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

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

注意

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

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

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

イベントの分類

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

チャネル

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

用語

定義

管理

管理イベントの対象は、主にエンド ユーザー、管理者、およびサポートです。管理チャネルのイベントは、管理者が対応できる明確な解決策が存在する問題を示します。たとえば、アプリケーションがプリンターに接続できなかった場合に発生するイベントなどがあります。これらのイベントには、詳しい解説が付属するか、問題の解決方法をユーザーに伝えるメッセージが関連付けられています。

運用

運用イベントは、問題や事象の分析および診断のために使用されます。問題や事象に応じたツールまたはタスクを起動する目的で使用できます。たとえば、プリンターがシステムに追加されたり、システムから削除された場合に発生するイベントなどがあります。

分析

非常に多くの分析イベントが公開されています。プログラムの動作を説明するもので、主にパフォーマンス調査に用いられます。

デバッグ

デバッグ イベントは、開発者がデバッグ時に問題を診断する目的でのみ使用されます。

注意
デバッグ チャネル内のイベントは、実装固有の内部状態データを返します。これらのイベントが返すスキーマおよびデータは、SQL Server の将来のバージョンで変更または無効化される可能性があります。このため、デバッグ チャネル内のイベントは、SQL Server の将来のバージョンで予告なく変更または削除される可能性があります。

キーワード

キーワードはアプリケーション固有の情報です。キーワードを使用すると、関連するイベントをより細かく分類できるため、セッションで使用するイベントの指定および取得が容易になります。次のクエリを使用すると、キーワード情報を取得できます。

select map_value Keyword from sys.dm_xe_map_values
where name = 'keyword_map'

select map_value Keyword from sys.dm_xe_map_values
where name = 'keyword_map'
注意

キーワードを使用すると、現在の SQL トレース イベントのグループを緊密に対応付けることができます。

ターゲット

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

アクション

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

注意

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

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

  • スタック ダンプをキャプチャしてデータを検査する。

  • 変更可能なストレージを使って状態情報をローカル コンテキストに保存する。

  • イベント データを集計する。

  • イベント データにデータを追加する。

アクションの代表的な使用例を次に示します。

  • スタック ダンプ機能

  • 実行プランの検出 (SQL Server のみ)

  • Transact-SQL スタック コレクション (SQL Server のみ)

  • 実行時の統計計算

  • 例外時のユーザー入力の収集

述語

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

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

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

注意

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

データは一連のバイトの集合であるため、そのバイト集合の長さと特性がわからなければ、データを解釈することはできません。この情報は、Type オブジェクトにカプセル化されています。パッケージ オブジェクトには、次の型が用意されています。

  • event

  • action

  • target

  • pred_source

  • pred_compare

  • type

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

マップ

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

select map_key, map_value from sys.dm_xe_map_values
where name = 'lock_mode'

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 RX_X

21 RX_X

たとえば、このテーブルに mode という名前の列があり、その値が 5 であると仮定します。このテーブルによると、5 は X に対応しており、そこからロックの種類が Exclusive であることがわかります。