SQL Server 拡張イベント ターゲット
SQL Server 拡張イベント ターゲットは、イベントのコンシューマーです。ファイルへの書き込み、イベント データの集計、イベントに関連したタスクの開始などは、ターゲットによって実行されます。ターゲットは、データを同期的または非同期的に処理できます。
拡張イベントの設計上、ターゲットは、セッションごとに 1 回だけイベントを受け取ります。
拡張イベント セッションで使用できる、拡張イベントに用意されたターゲットは次のとおりです。
イベント バケット
指定されたイベント列またはアクションに基づいて、指定されたイベントが発生する回数をカウントします。
イベント ペアリング
ロックの取得とロックの解放など、対で発生するイベントが数多く存在します。指定された 1 対のイベントの組み合わせが一致するかどうかを判定します。
Event Tracing for Windows (ETW)
SQL Server イベントを、Windows オペレーティング システムまたはアプリケーション イベント データと関連付けます。
イベント ファイル
イベント セッション出力を、メモリ バッファー全体からディスクに書き込みます。
同期イベント カウンター
拡張イベント セッション中に発生した、すべての指定されたイベントをカウントします。完全なイベント コレクションのオーバーヘッドを追加しなくても、負荷の特性に関する情報を取得できます。
リング バッファー
先入れ先出し (FIFO) 順またはイベントごとの FIFO に基づいて、イベント データをメモリに格納します。
ターゲットはファイル ターゲットとメモリ内ターゲットに分けることができます。
イベント ファイル ターゲットと ETW ターゲットはファイル ターゲットと見なされます。
イベント バケット ターゲット、イベント ペアリング ターゲット、同期イベント カウンター ターゲット、およびリング バッファー ターゲットは、メモリ内ターゲットと見なされ、データはセッションのバッファー (sys.dm_xe_session_targets 動的管理ビューの target_data 列) に格納されます。
メモリ内ターゲットを使用するセッションを停止した場合、セッションのバッファーに格納されているすべての情報が失われることに注意してください。セッションを停止した後にイベント データにアクセスする場合は、ファイル ターゲットを使用するようにセッションを構成する (推奨) か、セッションを停止する前にデータを保存する必要があります。
使用するターゲットを決定するには、次のガイドラインが役立ちます。
ターゲット |
推奨される使用法 |
---|---|
イベント ファイル ターゲットまたは ETW ターゲット |
次の 1 つ以上の条件に該当する場合は、ファイル ターゲットを使用します。
|
リング バッファー ターゲット |
次の条件に該当する場合は、リング バッファー ターゲットを使用します。
|
イベント バケット ターゲット、イベント ペアリング ターゲット、または同期イベント カウンター ターゲット |
次の条件に該当する場合は、いずれかのメモリ内ターゲットを使用します。
|
イベント バケット ターゲット
イベント バケット ターゲットは、イベント データに基づいて、特定の種類のイベントの発生をグループ化します。"バケット" は、指定されたイベント列またはアクションに基づいてカウントされるイベントのグループです。イベント バケット ターゲットを使用して、パフォーマンス上の問題のトラブルシューティングを行うことができます。どのイベントが最もよく発生するかを識別することで、パフォーマンス上の問題を引き起こす可能性を示す "ホットスポット" を見つけることができます。
次の表では、イベント バケット ターゲットの構成に使用できるオプションについて説明します。
オプション |
指定できる値 |
説明 |
---|---|---|
slots |
任意の整数値。この値はオプションです。 |
保持するバケットの最大数を示すユーザー指定の値。この値に達した場合、既存のバケットに属していない新しいイベントは無視されます。 |
filtering_event_name |
拡張イベント セッション内に存在するすべてのイベント。この値はオプションです。 |
イベントのクラスを識別するためのユーザー指定の値。指定されたイベントのインスタンスだけがバケット化されます。それ以外のすべてのイベントは無視されます。 この値は、package_name.event_name 形式で指定する必要があります (例 : 'sqlserver.checkpoint_end')。次のクエリを使用すると、パッケージ名を特定できます。
filtering_event_name 値を指定しない場合は、source_type を 1 (既定値) に設定する必要があります。 |
source_type |
バケットの基になっているオブジェクトの種類。この値は省略可能で、指定しない場合は既定値 1 が使用されます。 |
次のいずれかの値になります。
|
source |
イベント列またはアクション名。 |
データ ソースとして使用されるイベント列またはアクション名です。 source に対してイベント列を指定する場合は、filtering_event_name 値に使用されているイベントの列を指定する必要があります。次のクエリを使用すると、使用できる列を特定できます。
source に対してイベント列を指定する場合は、パッケージ名を source 値に含める必要はありません。 source に対してアクション名を指定する場合は、このターゲットが使用されているイベント セッションのコレクションに対して構成されているいずれかのアクションを使用する必要があります。アクション名に使用できる値を調べるには、sys.dm_xe_sesssion_event_actions ビューの action_name 列に対するクエリを実行します。 アクション名をデータ ソースとして使用している場合は、package_name.action_name 形式で source 値を指定する必要があります。 |
高いレベルでイベント バケット ターゲットによってどのようにデータが収集されるかを次の例に示します。この例では、イベント バケット ターゲットを使用して、待機が何回発生したかを待機の種類別にカウントします。この場合、イベント バケット ターゲットを定義するときに次のオプションを指定します。
filtering_event_name = 'wait_info'
source = 'wait_type'
source_type = 0 (wait_type がイベント列のため)
この例のシナリオでは、wait_type ソースに対して次のデータが記録されます。
フィルター イベント名 |
ソース列値 |
---|---|
wait_info |
file_io |
wait_info |
file_io |
wait_info |
network |
wait_info |
network |
wait_info |
sleep |
待機の種類値は、次の値とスロット数を持つ 3 つのバケットに分類されます。
値 |
スロット数 |
---|---|
file_io |
2 |
network |
2 |
sleep |
1 |
イベント バケット ターゲットの構文の詳細については、「拡張イベントを使用してシステムの使用状況を監視する方法」を参照してください。
バケット ターゲットによって保持されるのは、指定されたソースのイベント データだけです。イベント データが大きすぎて全体を保持することができない場合もあります。その場合は、データが切り捨てられます。イベント データが切り捨てられた場合、バイト数が記録されて、XML 出力として表示されます。
バケット ターゲットは、呼び出し元のプログラムまたはプロシージャに対するデータを XML 形式でシリアル化します。
注 |
---|
バケット出力は、いずれのスキーマにも準拠しません。 |
次の例は、バケット ターゲットの出力形式を示しています。
<Slots truncated = "0" buckets=[count]>
<Slot count=[count] trunc=[truncated bytes]>
<value>
</value>
</Slot>
</Slots>
<Slots truncated = "0" buckets=[count]>
<Slot count=[count] trunc=[truncated bytes]>
<value>
</value>
</Slot>
</Slots>
イベント ペアリング ターゲット
イベント ペアリング ターゲットは、各イベントに存在する単一列または複数列のデータを使って 2 つのイベントを照合します。ロックの取得とロックの解放など、対で発生するイベントが数多く存在します。イベント シーケンスが対で発生した後は、両方のイベントが破棄されます。一対のイベントを破棄することによって、取得されたまま解放されていないロックを容易に検出できます。
イベント レベルのフィルターを使用すると、設定済みの条件に合致しないイベントだけを、ペアリング ターゲットを使ってキャプチャできます。
イベント ペアリング ターゲットを使用する場合は、照合に使用する列のシーケンスのほか、照合する 2 つのイベントを選択できます。このシーケンス内のすべての列は、同じ型であることが必要です。
次の表では、イベント ペアリングの構成に使用できるオプションについて説明します。
オプション |
指定できる値 |
説明 |
---|---|---|
begin_event |
現在のセッションに存在する任意のイベント名。 |
対で発生するイベントのうち最初に発生するイベントの名前です。 |
end_event |
現在のセッションに存在する任意のイベント名。 |
対で発生するイベントのうち最後に発生するイベントの名前です。 |
begin_matching_columns |
コンマ区切りで順に指定された列名。 |
照合に使用する列です。 |
end_matching_columns |
コンマ区切りで順に指定された列名。 |
照合に使用する列です。 |
begin_matching_actions |
コンマ区切りで順に指定されたアクション。 |
照合に使用するアクションです。 |
end_matching_actions |
コンマ区切りで順に指定されたアクション。 |
照合に使用するアクションです。 |
respond_to_memory_pressure |
次の値のいずれかになります。
|
ターゲットは、メモリ イベントに応答します。1 に設定した場合、サーバーのメモリが不足すると、それまで保持されていた、対になっていない情報は削除されます。 |
イベントに関連付けられているすべてのデータはキャプチャされて、その後のペアリングに備えて保存されます。また、アクションによって追加されたデータも収集されます。収集されたイベント データはメモリに格納されるため、格納できるサイズには上限があります。この制限は、システムの容量とアクティビティに依存します。使用メモリ量は利用可能なシステム リソースに基づくため、使用可能な最大メモリ量をパラメーターとして指定することはありません。システム リソースが不足した場合、それまで保持されていた、対になっていないイベントは破棄されます。イベントが対になっておらず破棄された場合、照合イベントは、対になっていないイベントとして発生します。
対になっていないイベントは、ペアリング ターゲットによって XML 形式にシリアル化されます。この形式は、いずれのスキーマにも準拠しません。この形式に含まれる要素は 2 種類だけです。ルートは <unpaired> 要素で、その後に、対になっていないイベント (現在追跡中のイベント) ごとに 1 つの <event> 要素が存在します。<event> 要素には、対になっていないイベントの名前を保持する属性が 1 つ存在します。
次の例は、ペアリング ターゲットの出力形式を示しています。
<unpaired truncated = "0" matchedCount = "[matched count]" memoryPressureDroppedCount = " [lost count]">
<event name = "[event name]" package = "[package]" id= "[event ID value]" version = "[event version]">
<data name = "[column name]">
<type name = "[column type]" package = "[type package]" />
<value>[column value]</value>
<text value>[text value]</text>>
</data>
</event>
</unpaired>
<unpaired truncated = "0" matchedCount = "[matched count]" memoryPressureDroppedCount = " [lost count]">
<event name = "[event name]" package = "[package]" id= "[event ID value]" version = "[event version]">
<data name = "[column name]">
<type name = "[column type]" package = "[type package]" />
<value>[column value]</value>
<text value>[text value]</text>>
</data>
</event>
</unpaired>
Event Tracing for Windows ターゲット
Event Tracing for Windows (ETW) をターゲットとして使用する前に、ETW を活用するための知識を身に付けておくことをお勧めします。ETW トレースは、拡張イベントと組み合わせて使用されるか、拡張イベントのイベント コンシューマーとして使用されます。ETW の背景情報については、次の外部リンクを参照してください。
拡張イベントは、Windows XP および Windows Server 2003 バージョンの ETW をサポートしています。ETW ターゲットは、多くのセッションに追加できますが、シングルトン ターゲットです。多くのセッションでイベントが発生した場合、イベントは、イベントの発生ごとに 1 回、ETW ターゲットのみに反映されます。拡張イベント エンジンは、プロセスあたり 1 つのインスタンスに制限されます。
重要 |
---|
ETW ターゲットを動作させるには、SQL Server サービス開始アカウントが Performance Log Users グループのメンバーであることが必要です。 |
ETW セッションに存在するイベントの構成は、拡張イベント エンジンがホストするプロセスによって制御されます。拡張イベント エンジンは、発生させるイベントのほか、どのような条件が満たされた場合にイベントを発生させるかを制御します。
拡張イベント セッションへのバインド後、つまり、プロセスの有効期間中に初めて ETW ターゲットがアタッチされたとき、ETW ターゲットは、SQL Server プロバイダー上で単一の ETW セッションを開きます。ETW セッションが既に存在していた場合、ETW ターゲットは、既存のセッションへの参照を取得します。この ETW セッションは、特定のコンピューター上のすべての SQL Server インスタンス間で共有されます。ETW ターゲットが割り当てられているセッションで発生したすべてのイベントは、この ETW セッションが受け取ることになります。
ETW では、プロバイダーがイベントを利用して、それを ETW に渡すことができるようになっている必要があります。そのため、セッションでは、すべての拡張イベント パッケージが有効化されます。ETW ターゲットは、発生したイベントを、そのイベントのプロバイダーが有効になっているセッションへ送信します。
ETW ターゲットは、発生元スレッドでのイベントの同期発行をサポートします。イベントの非同期発行はサポートしません。
ETW ターゲットは、外部 ETW コントローラー (たとえば logman.exe) からのコントロールをサポートしません。ETW トレースを生成するには、ETW ターゲットを使用してイベント セッションを作成する必要があります。詳細については、「CREATE EVENT SESSION (Transact-SQL)」を参照してください。
注 |
---|
ETW ターゲットを有効にすると、XE_DEFAULT_ETW_SESSION という名前の ETW セッションが作成されます。XE_DEFAULT_ETW_SESSION という名前のセッションが既に存在する場合は、既存のセッションのプロパティを変更せずに使用されます。XE_DEFAULT_ETW_SESSION はすべての SQL Server のインスタンス間で共有されます。XE_DEFAULT_ETW_SESSION を開始した後に停止する場合は、Logman ツールなどの ETW コントローラーを使用する必要があります。たとえば、コマンド プロンプトで logman stop XE_DEFAULT_ETW_SESSION -ets コマンドを実行できます。 |
次の表では、ETW ターゲットの構成に使用できるオプションについて説明します。
オプション |
指定できる値 |
説明 |
---|---|---|
default_xe_session_name |
256 文字までの任意の文字列。この値はオプションです。 |
拡張イベント セッション名。既定値は XESESSION0_4B7A5EC6-37EF-4d4c-81EC-13C547B9AC46 です。 |
default_etw_session_logfile_path |
256 文字までの任意の文字列。この値はオプションです。 |
拡張イベント セッションのログ ファイルへのパス。既定値は %TEMP%\ XEEtw.etl です。 |
default_etw_session_logfile_size_mb |
任意の符号なし整数。この値はオプションです。 |
拡張イベント セッションのログ ファイル サイズ (MB)。既定値は 20 MB です。 |
default_etw_session_buffer_size_kb |
任意の符号なし整数。この値はオプションです。 |
拡張イベント セッションのメモリ内バッファーのサイズ (KB)。既定値は 128 KB です。 |
retries |
任意の符号なし整数。 |
ETW サブシステムへのイベントのパブリッシュを再試行する回数。この回数を超えるとイベントが破棄されます。既定値は 0 です。 |
以上の設定は省略できます。これらの設定については既定値が使用されます。
ETW ターゲットは、次のような役割を持ちます。
既定の ETW セッションを作成する。
すべての拡張イベント パッケージを ETW に登録する。これによって、ETW に登録されたイベントは破棄されなくなります。
ETW に対するイベント フローを管理する。ETW ターゲットは、拡張イベント データを持つ ETW イベントを作成して、それを適切な ETW セッションに送信します。イベントがバッファー サイズを超えた場合、またはデータを 1 つの ETW イベントに収めることができなかった場合、そのイベントは ETW によって複数のフラグメントに分割されます。
拡張イベント パッケージを常時有効に保つ。
次に ETW で使用される既定のファイル パスを示します。
ETW 出力ファイルは %TEMP%\XEEtw.etl に格納されます。
重要 最初のセッションの開始後にファイル パスを変更することはできません。
マネージ オブジェクト形式 (MOF) のファイルは <インストール パス>\Microsoft SQL Server\Shared に格納されます。詳細については、MSDN の「マネージ オブジェクト形式」を参照してください。
イベント ファイル ターゲット
イベント ファイル ターゲットは、完全なバッファーをディスクに書き込む非同期ターゲットです。ファイル ターゲットによって、ログとメタデータの 2 種類のファイルが作成されます。メタデータ ファイルでは、ターゲット出力ログ ファイルに含まれるイベントの内容を記述します。これにより、ログ ファイル内のすべてのイベントを正しく解析できるようになり、イベントに関連付けられたアクション データも解析できるようになります。
このターゲットを使用するには、ログ ファイルとメタデータ ファイルの場所名を指定する必要があります。ファイル サイズや拡張特性などの他の構成オプションは省略可能です。
次の表では、イベント ファイル ターゲットの構成に使用できるオプションについて説明します。
オプション |
指定できる値 |
説明 |
---|---|---|
filename |
260 文字までの任意の文字列。この値は必須です。 |
ファイルの場所とファイル名。 任意のファイル名拡張子を使用できます。 |
max_file_size |
任意の 64 ビット整数。この値はオプションです。 |
ファイルの最大サイズ (MB)。max_file_size を指定しない場合、ファイルはディスクがいっぱいになるまで拡張されます。既定のファイル サイズは 1 GB です。 max_file_size は、セッション バッファーの現在のサイズを超えるサイズである必要があります。そうでないと、ファイル ターゲットの初期化が失敗し、max_file_size が無効であるとレポートされます。バッファーの現在のサイズを表示するには、sys.dm_xe_sessions 動的管理ビューで buffer_size 列に対するクエリを発行します。 既定のファイル サイズがセッション バッファー サイズ未満の場合は、max_file_size を、sys.server_event_sessions カタログ ビューの max_memory 列に指定された値に設定することをお勧めします。 max_file_size をセッション バッファーのサイズを超えて設定した場合、セッション バッファーのサイズの最も近い倍数に丸められたサイズが使用されます。その結果、max_file_size に指定した値に満たないターゲット ファイルが作成されることがあります。たとえば、バッファー サイズが 100 MB のときに max_file_size を 150 MB に設定した場合、2 番目のバッファーが残りの 50 MB のスペースに収まらないため、結果のファイル サイズは 100 MB に丸められます。 既定のファイル サイズがセッション バッファー サイズ未満の場合は、max_file_size を、sys.server_event_sessions カタログ ビューの max_memory 列の値に設定することをお勧めします。 |
max_rollover_files |
任意の 32 ビット整数。この値はオプションです。 |
ファイル システム内に保持するファイルの最大数。 |
increment |
任意の 32 ビット整数。この値はオプションです。 |
ファイルの拡張増分値 (MB)。指定しない場合、増分の既定値はセッション バッファー サイズの 2 倍になります。 |
metadatafile |
260 文字までの任意の文字列。この値は必須です。 |
ファイルのメタデータの場所と名前。 |
ファイル ターゲットが初めて作成されるとき、指定したファイル名に 0 と長整数値が付加されます。整数値は、1600 年 1 月 1 日からファイルが作成された日時までのミリ秒数として計算されます。後続のロールオーバー ファイルでもこの形式が使用されます。長整数値を調べることで、最新のファイルを判別できます。次の例は、filename オプションに C:\OutputFiles\MyOutput.xel と指定した場合のファイルの名前の決定方法を示しています。
最初に作成されるファイル : C:\OutputFiles\MyOutput_0_128500310259380000.xel
最初のロールオーバー ファイル : C:\OutputFiles\MyOutput_0_128505831770890000.xel
2 番目のロールオーバー ファイル : C:\OutputFiles\MyOutput_0_132410772966237000.xel
同期イベント カウンター ターゲット
同期イベント カウンター ターゲットは、拡張イベント セッション中に発生したすべてのイベントをカウントします。同期イベント カウンター ターゲットを使用すると、完全なイベント コレクションのオーバーヘッドを追加することなく負荷の特性に関する情報を取得できます。このターゲットには、カスタマイズ可能なパラメーターはありません。
次の例は、同期イベント カウンター ターゲットの出力を示しています。
<CounterTarget truncated = "0">
<Packages>
<Package name = "[package name]">
<Event name = "[event name]" count = "[number]" />
</Package>
</Packages>
</CounterTarget>
<CounterTarget truncated = "0">
<Packages>
<Package name = "[package name]">
<Event name = "[event name]" count = "[number]" />
</Package>
</Packages>
</CounterTarget>
リング バッファー ターゲット
リング バッファー ターゲットは、メモリにイベント データを一時的に保持します。このターゲットでは、2 種類のモードのいずれかでイベントを管理できます。
1 つ目のモードは厳密な先入れ先出し (FIFO) です。このモードでは、ターゲットに割り当てられたメモリがすべて使用されると、最も古いイベントが破棄されます。このモード (既定値) では、occurrence_number オプションは 0 に設定されます。
2 つ目のモードはイベントごとの FIFO です。このモードでは、各種イベントが指定した数だけ保持されます。ターゲットに割り当てられたメモリがすべて使用されると、それぞれの種類の中で最も古いイベントが破棄されます。occurrence_number オプションを構成して、種類ごとに保持するイベントの数を指定できます。
次の表では、リング バッファー ターゲットの構成に使用できるオプションについて説明します。
オプション |
指定できる値 |
説明 |
---|---|---|
default_memory |
任意の 32 ビット整数。この値はオプションです。 |
使用するメモリの最大量 (KB)。この値に達すると、既存のイベントが破棄されます。 |
occurrence_number |
次の値のいずれかになります。
この値はオプションです。 |
使用する FIFO モード。0 を超える値に設定した場合は、種類ごとにバッファーに保持するイベントの数を表します。 |
次の例は、リング バッファー ターゲットの出力を示しています。
<RingBufferTarget eventsPerSec="" processingTime="" totalEventsProcessed="" eventCount="" droppedCount="" memoryUsed="">
<event name="" package="" id="" version="" timestamp="">
<data name="">
<type name="" package="" />
<value></value>
<text></text>
</data>
<action name="" package="">
<type name="" package="" />
<value></value>
<text></text>
</action>
</event>
</RingBufferTarget>
<RingBufferTarget eventsPerSec="" processingTime="" totalEventsProcessed="" eventCount="" droppedCount="" memoryUsed="">
<event name="" package="" id="" version="" timestamp="">
<data name="">
<type name="" package="" />
<value></value>
<text></text>
</data>
<action name="" package="">
<type name="" package="" />
<value></value>
<text></text>
</action>
</event>
</RingBufferTarget>