次の方法で共有


拡張イベントターゲット

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL データベース

この記事では、拡張イベントターゲットを使用するタイミングと方法について説明します。 各ターゲットについて、この記事では以下について説明します。

  • イベント データを収集およびレポートする能力
  • ターゲットを使用するイベント セッションの例

次の表では、異なる SQL プラットフォームでの各ターゲットの種類の可用性について説明します。

ターゲットの型 SQL Server Fabric 内の Azure SQL Database と SQL データベース Azure SQL Managed Instance
イベントファイル はい はい はい
リングバッファ はい はい はい
event_stream はい はい はい
ヒストグラム はい はい はい
イベント_カウンター はい はい はい
ペアマッチング はい いいえ いいえ
etw_classic_sync_target はい いいえ いいえ

別の方法で説明しない限り、ターゲットは、受信したデータを非同期的に処理します。

この記事を最大限に活用するには、次の操作を行う必要があります。

event_file ターゲット

event_file ターゲットは、メモリ バッファーからディスク ファイルまたは Azure Storage の BLOB にイベント セッション出力を書き込みます。

  • filename 句で ADD TARGET パラメーターを指定します。 ファイル名の拡張子は xel にする必要があります。

  • 選択したファイル名は、日付/時刻ベースの数値を付加するプレフィックスとしてシステムによって使用され、その後に xel 拡張子が続きます。

  • 必要に応じて、 MAX_FILE_SIZE パラメーターを指定できます。 新しいファイルが作成される前にファイルを拡張できる最大サイズ (MB) を MB 単位で定義します。

  • 必要に応じて、 MAX_ROLLOVER_FILES オプションを指定して、現在のファイルに加えて、ファイル システムに保持するファイルの最大数を選択できます。 既定値は UNLIMITED です。 MAX_ROLLOVER_FILESが評価されると、ファイルの数がMAX_ROLLOVER_FILES設定を超えると、古いファイルが削除されます。

Important

セッションに追加されるイベントによっては、 event_file ターゲットによって生成されるファイルに機密データが含まれている場合があります。 不要な読み取りアクセスを許可しないように、ファイル システムを慎重に確認し、ディレクトリと個々の .xel ファイルに対するアクセス許可 (継承アクセスを含む) を共有します。 最小特権の原則に従います。 機密データを誤って収集するリスクを軽減するために、機密データを収集する可能性がある場合は、実行時間の長いイベント セッションを回避します。

Azure SQL Database と Azure SQL Managed Instance では、 パラメーターの値として filename 内の BLOB のみがサポートされます。 Azure SQL Database、Fabric の SQL データベース、または Azure SQL Managed Instance の event_file コード例については、「 Azure Storage でevent_file ターゲットを使用したイベント セッションの作成」を参照してください。

ローカルファイルシステムにおいて、ターゲット「event_file」のイベントセッションを作成する

ローカル ファイル ストレージを使用する event_file を使用して SSMS または T-SQL を使用してイベント セッションを作成するチュートリアルについては、「 クイック スタート: 拡張イベント」を参照してください。

Azure Storage において event_file ターゲットを使用してイベント セッションを作成する

Azure Storage でストレージ アカウントを作成する方法の詳細については、「ストレージ アカウントの作成」を参照してください。 ストレージ アカウントは、Azure portal、PowerShell、Azure SQL、ARM テンプレート、または Bicep テンプレートを使用して作成できます。 ある条件を満たすアカウントを使用してください。

  • Standard general-purpose v2 アカウントです。
  • Hot blob アクセス層を使用します
  • Azure 仮想マシン (Azure VM) で SQL Server を使用する場合、ストレージ アカウントは Azure VM と同じ Azure リージョンに存在する必要があります。
  • 階層型名前空間が有効になっていません。

次に、Azure portal を使用して、このストレージ アカウントに コンテナーを作成します 。 PowerShell または Azure CLI使用してコンテナーを作成することもできます。

作成した ストレージ アカウントコンテナー の名前をメモします。 次の手順で使用します。

イベント データを読み書きするには、データベース エンジンに特定のアクセス権が必要です。 このアクセス権は、認証の種類 ( マネージド ID または Shared Access Signature (SAS) トークンを使用したシークレットベースの認証) の選択に応じて異なります。

Azure Storage に対して認証を行うには、データベース エンジンに サーバー スコープの資格情報またはデータベース スコープの資格情報が必要です。この資格情報によって、使用する認証の種類が通知され、シークレットベースの認証用のシークレットが提供されます。 この資格情報を作成するには、 CONTROL データベースのアクセス許可が必要です。

SQL Server と Azure SQL Managed Instance の場合、このアクセス許可は master データベースで必要です。 既定では、アクセス許可は、db_ownermaster データベース ロールのメンバーと、インスタンスのsysadmin サーバー ロールのメンバーによって保持されます。 Fabric の Azure SQL Database と SQL データベースの場合、このアクセス許可は、データベース所有者 (dbo)、 db_owner データベース ロールのメンバー、および論理サーバーの管理者によって保持されます。

資格情報が作成されると、イベント セッションを作成する残りの手順では、 CONTROL アクセス許可は必要ありません。 必要な特定の アクセス許可については、「アクセス許可 」を参照してください。

マネージド ID を使用してアクセスを許可する

Microsoft Entra 認証でマネージド ID を使用する場合は、コンテナーの ストレージ BLOB データ共同作成者 RBAC ロールを、データベース エンジンによって使用されるマネージド ID に割り当てます。 詳細については、SQL プラットフォームに基づく以下を参照してください。

RBAC ロールの割り当てが完了したら、次の手順を使用します。

  1. T-SQL を使用して資格情報を作成します。

    次の T-SQL バッチを実行する前に、次の変更を行います。

    • 3 回発生する https://<storage-account-name>.blob.core.windows.net/<container-name>すべてで、 <storage-account-name> をストレージ アカウントの名前に置き換え、 <container-name> をコンテナーの名前に置き換えます。 URL の末尾にスラッシュがないことを確認してください。

    サーバースコープの資格情報を作成する: (SQL Server と Azure SQL Managed Instance に適用)

    SSMS などのクライアント ツールを使用して、新しいクエリ ウィンドウを開き、イベント セッションを作成するインスタンス上 master データベースに接続し、次の T-SQL バッチを貼り付けます。

    /* The name of the credential must match the URL of the blob container. */
    IF EXISTS (SELECT 1
               FROM sys.credentials
               WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>')
        DROP CREDENTIAL
            [https://<storage-account-name>.blob.core.windows.net/<container-name>];
    
    /* When using managed identity, the credential does not contain a secret */
    CREATE CREDENTIAL
        [https://<storage-account-name>.blob.core.windows.net/<container-name>]
        WITH IDENTITY = 'MANAGED IDENTITY';
    

    データベース スコープの資格情報を作成します (Azure SQL Database、Azure SQL Managed Instance、Fabric の SQL データベースに適用されます)

    SSMS などのクライアント ツールを使用して、新しいクエリ ウィンドウを開き、イベント セッションを作成するユーザー データベースに接続し、次の T-SQL バッチを貼り付けます。 master データベースではなく、ユーザー データベースに接続されていることを確認します。

    /* The name of the credential must match the URL of the blob container. */
    IF EXISTS (SELECT 1
               FROM sys.database_credentials
               WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>')
        DROP DATABASE SCOPED CREDENTIAL
            [https://<storage-account-name>.blob.core.windows.net/<container-name>];
    
    /* When using managed identity, the credential does not contain a secret */
    CREATE DATABASE SCOPED CREDENTIAL
        [https://<storage-account-name>.blob.core.windows.net/<container-name>]
        WITH IDENTITY = 'MANAGED IDENTITY';
    
  2. 次に、手順に従って SSMS で Azure Storage の event_file をターゲットとしたイベント セッションを作成します

Shared Access Signature (SAS) トークンを使用してアクセスを許可する

シークレット ベースの認証を使用する場合は、コンテナーの Shared Access Signature (SAS) トークンを作成します。 この認証の種類を使用するには、 ストレージ アカウントに対して [ストレージ アカウント キーのアクセスを許可 する] オプションを有効にする必要があります。 詳細については、Azure ストレージ アカウントの共有キーによる認可の禁止に関するページを参照してください。

  1. Azure portal で、作成したストレージ アカウントとコンテナーに移動します。 コンテナーを選択し、[ 設定] > [共有アクセス トークン] に移動します。

    SAS トークンは、次の要件を満たす必要があります。

    • ReadWriteDeleteListに設定されています。
    • 開始時刻有効期限は、イベント セッションの有効期間を含む必要があります。 作成する SAS トークンは、この時間間隔内でのみ機能します。
    • Fabric の Azure SQL Database、Azure SQL Managed Instance、および SQL データベースの場合、SAS トークンには IP アドレスの制限がない必要があります。

    [ SAS トークンと URL の生成 ] ボタンを選択します。 SAS トークンは、[ BLOB SAS トークン ] ボックスにあります。 これをコピーして、次の手順で使用できます。

    Important

    SAS トークンは、このコンテナーへの読み取りと書き込みのアクセスを提供します。 パスワードやその他のシークレットを扱うように扱います。

    Azure Storage コンテナーの [Shared Access Tokens]\(共有アクセス トークン\) 画面のスクリーンショット。サンプル コンテナーの SAS トークンが生成されています。

  2. T-SQL を使用して SAS トークンを格納する資格情報を作成します。

    次の T-SQL バッチを実行する前に、次の変更を行います。

    • サーバー スコープの資格情報を作成し、 CREATE MASTER KEY ステートメントを使用する場合は、 <password> をマスター キーを保護する強力なパスワードに置き換えます。 詳細については、「CREATE MASTER KEY」を参照してください。

    • 3 回発生する https://<storage-account-name>.blob.core.windows.net/<container-name>すべてで、 <storage-account-name> をストレージ アカウントの名前に置き換え、 <container-name> をコンテナーの名前に置き換えます。

    • SECRET句で、<sas-token>を前の手順でコピーした SAS トークンに置き換えます。

    サーバースコープの資格情報を作成する: (SQL Server と Azure SQL Managed Instance に適用)

    SSMS などのクライアント ツールを使用して、新しいクエリ ウィンドウを開き、イベント セッションを作成するインスタンスの master データベースに接続し、次の T-SQL バッチを貼り付けます。

    /* Create a master key to protect the secret of the credential */
    IF NOT EXISTS (SELECT 1
                   FROM sys.symmetric_keys
                   WHERE name = '##MS_DatabaseMasterKey##')
        CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>'
    
    /* The name of the credential must match the URL of the blob container. */;
    IF EXISTS (SELECT 1
               FROM sys.credentials
               WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>')
        DROP CREDENTIAL
            [https://<storage-account-name>.blob.core.windows.net/<container-name>];
    
    /* The secret is the SAS token for the container. */
    CREATE CREDENTIAL
        [https://<storage-account-name>.blob.core.windows.net/<container-name>]
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
        SECRET = '<sas-token>';
    

    データベース スコープの資格情報を作成します (Azure SQL Database、Azure SQL Managed Instance、Fabric の SQL データベースに適用されます)

    SSMS などのクライアント ツールを使用して、新しいクエリ ウィンドウを開き、イベント セッションを作成するデータベースに接続して、次の T-SQL バッチを貼り付けます。 master データベースではなく、ユーザー データベースに接続されていることを確認します。

    /* The name of the credential must match the URL of the blob container. */
    IF EXISTS (SELECT 1
               FROM sys.database_credentials
               WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>')
        DROP DATABASE SCOPED CREDENTIAL
            [https://<storage-account-name>.blob.core.windows.net/<container-name>];
    
    /* The secret is the SAS token for the container. */
    CREATE DATABASE SCOPED CREDENTIAL
        [https://<storage-account-name>.blob.core.windows.net/<container-name>]
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
        SECRET = '<sas-token>';
    
  3. 次に、次のセクションの手順に従って、Azure Storage の event_file ターゲットを使用して SSMS でイベント セッションを作成します

Azure Storage の event_file ターゲットを使用して、SSMS でイベント セッションを作成する

ストレージ コンテナーへのアクセスを提供する資格情報が作成されたら、イベント セッションを作成できます。 資格情報の作成とは異なり、イベント セッションを作成するには、 CONTROL アクセス許可は必要ありません。 資格情報が作成されたら、アクセス許可が制限されている場合でも、イベント セッションを作成できます。 必要な特定の アクセス許可については、「アクセス許可 」を参照してください。

SSMS で新しいイベント セッションを作成するには:

  1. SQL Server と Azure SQL Managed Instance の場合は、[管理] フォルダーの下にある [拡張イベント] ノードを展開します。 Fabric の Azure SQL Database と SQL データベースの場合は、データベースの下にある [拡張イベント ] ノードを展開します。

  2. [セッション] フォルダーを右クリックし、[新しいセッション...] を選択します。

  3. [ 全般 ] ページで、セッションの名前を入力します。これは次のコード サンプル example-session

  4. [ イベント ] ページで、セッションに追加する 1 つ以上のイベントを選択します。 たとえば、 sql_batch_starting イベントを選択できます。

  5. [ データ ストレージ ] ページで、ターゲットの種類として event_file を選択します。 ストレージ コンテナーの URL を [ ストレージ URL ] ボックスに貼り付けます。 この URL の末尾にスラッシュ (/) を入力し、その後にファイル (BLOB) 名を入力します。 たとえば、「 https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel 」のように入力します。

  6. セッションが構成されたので、必要に応じて [ スクリプト ] ボタンを選択してセッションの T-SQL スクリプトを作成し、後で使用できるように保存することができます。

  7. [OK] を選択すると、セッションが作成されます。

  8. Object Explorer で、[セッション] フォルダーを展開して、作成したイベント セッションを表示します。 既定では、セッションは作成時に開始されません。 セッションを開始するには、セッション名を右クリックし、[セッションの開始] を選択 します。 セッションが実行されたら、[ セッションの停止 ] を選択して、後で停止できます。

T-SQL バッチが実行されると、セッションはストレージ コンテナー内のsql_batch_starting BLOB にexample-session.xel イベントを書き込みます。

SQL Managed Instance の場合、[データ ストレージ] ページにストレージ コンテナーの URL を貼り付ける代わりに、[スクリプト] ボタンを使用してセッションの T-SQL スクリプトを作成します。 filename引数の値としてコンテナー URL を指定し、スクリプトを実行してセッションを作成します。

T-SQL で Azure Storage の event_file ターゲットを使用したイベント セッションを作成する

Azure Storage ベースのCREATE EVENT SESSION ターゲットを追加するADD TARGET句を含むevent_fileの例を次に示します。

CREATE EVENT SESSION [example-session]
ON SERVER
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.event_file
(
    SET filename = N'https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel'
)
GO

Azure SQL Database または Fabric の SQL データベースでこの例を使用するには、 ON SERVERON DATABASEに置き換えます。

Azure Storage でイベントファイルターゲットのイベントセッションをトラブルシューティングする

次の一覧には、Azure Storage を使用する拡張イベント セッションを開始するときに発生する可能性があるエラーと、そのエラーについて考えられる説明が含まれています。

  • オペレーティング システムがエラー 5 を返しました: 'アクセスが拒否されました。'
    • マネージド ID 認証を使用する場合:
    • SAS トークン認証を使用する場合:
      • ストレージ アカウント のファイアウォール が有効になっている。 これは、SAS トークン認証を使用するイベント セッションではサポートされていません。
      • SAS トークンに十分なアクセス許可がない、または有効期限が切れています。 詳細については、「 SAS トークンを使用してアクセスを許可する」を参照してください。
      • 適用モードで ネットワーク セキュリティ境界 を使用する場合、データベースからの無制限の送信通信とストレージ アカウントへの無制限の受信通信を許可するアクセス規則は適用されません。
  • オペレーティング システムがエラー 86 を返しました: '指定されたネットワーク パスワードが正しくありません。'
  • オペレーティング システムがエラー 3 を返しました: 'システムが指定されたパスを見つけることができません。'
    • BLOB コンテナーの URL で指定されたコンテナーが存在しません。
  • オペレーティング システムがエラー 13 を返しました: 'データが無効です。'
    • BLOB コンテナーには 不変ポリシー があります。 不変ストレージは、イベント セッションではサポートされていません。
    • ストレージ アカウントでは、 階層型名前空間 が有効になっています。 階層型名前空間が有効になっているストレージ アカウントは、イベント セッションではサポートされていません。

sys.fn_xe_file_target_read_file() 関数

event_file ターゲットは、人間が読むことのできないバイナリ形式で、受信したデータを格納します。 sys.fn_xe_file_target_read_file関数を使用すると、xel ファイルの内容をリレーショナル行セットとして表すことができます。 使用例を含む詳細については、 sys.fn_xe_file_target_read_fileを参照してください。

ring_buffer ターゲット

ring_buffer ターゲットは、イベント セッションをすばやく開始し、メモリ内のイベント データのみを収集するのに役立ちます。 リング バッファー内の使用可能なメモリがイベントによって使用されると、古いイベントは破棄されます。 イベント セッションを停止すると、 ring_buffer ターゲットへのすべてのセッション出力も破棄されます。

次の 例に示すように、ring_buffer ターゲットから XML に変換してデータを使用します。 この変換中に、4 MB (メガバイト) XML ドキュメントに収まらないデータはすべて省略されます。 したがって、より大きな MAX_MEMORY 値を使用して(またはこのパラメータをデフォルト値のままにして)リング・バッファに多くのイベントをキャプチャしても、XML マークアップと Unicode 文字列のオーバーヘッドを考慮すると、XML ドキュメントのサイズに4 MB の制限があるため、すべてのイベントを消費できない可能性があります。

XML ドキュメント内の truncated 属性が次に示すように 1 に設定されている場合、XML への変換中にリング バッファーの内容が省略されることがわかります。

<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">

ヒント

ring_bufferターゲットを追加するときは、そのMAX_MEMORYパラメーターを 1,024 KB 以下に設定します。 値を大きくすると、メモリ消費量が不必要に増加する可能性があります。

既定では、MAX_MEMORY ターゲットのring_bufferは SQL Server では制限されず、Azure SQL Database、Azure SQL Managed Instance、Fabric の SQL データベースでは 32 MB に制限されます。

ring_buffer ターゲットとのイベント セッションを作成する

ring_buffer イベントを収集するlock_acquired ターゲットとのイベント セッションを作成し、リング バッファー内のイベントの合計数を 100 に制限する例を次に示します。 この例では、 MAX_MEMORY パラメーターは 2 回表示されます。1 回は、 ring_buffer ターゲット メモリを 1,024 KB に設定し、1 回はイベント セッション バッファー メモリを 2 MB に設定します。

Azure SQL Database または Fabric の SQL データベースでこの例を使用するには、 ON SERVERON DATABASEに置き換えます。

CREATE EVENT SESSION ring_buffer_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
ADD TARGET package0.ring_buffer
(
SET MAX_EVENTS_LIMIT = 100,
    MAX_MEMORY = 1024
)
WITH
(
    MAX_MEMORY = 2 MB,
    MAX_DISPATCH_LATENCY = 3 SECONDS
);

イベント セッションを開始するには、次のステートメントを実行します。

ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;

SSMS のリング バッファーで収集されたイベント データを表示するには、セッション ノードを展開し、 package0.ping_buffer ターゲットを選択します。 データは XML で表示されます。

セッションがアクティブな間にリレーショナル行セット内の ring_buffer ターゲットからのイベント データを表示するには、 XQuery 式を使用して XML をリレーショナル データに変換します。 例えば次が挙げられます。

;WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
    SELECT CAST (xst.target_data AS XML) AS TargetData
    FROM sys.dm_xe_session_targets AS xst
         INNER JOIN sys.dm_xe_sessions AS xs
             ON xst.event_session_address = xs.address
    WHERE xs.name = N'ring_buffer_lock_acquired'
),
/* A row for each event in the buffer, represented as an XML fragment */
EventNode AS
(
    SELECT CAST (NodeData.query('.') AS XML) AS EventInfo
    FROM RingBuffer AS rb
    CROSS APPLY rb.TargetData.nodes('/RingBufferTarget/event') AS n(NodeData)
)

/* A relational rowset formed by using the XQuery value method */
SELECT EventInfo.value('(event/@timestamp)[1]','datetimeoffset') AS timestamp,
       EventInfo.value('(event/@name)[1]','sysname') AS event_name,
       EventInfo.value('(event/data/value)[1]','nvarchar(max)') AS sql_batch_text
FROM EventNode
ORDER BY timestamp DESC;

event_stream ターゲット

event_stream ターゲットは、C# などの言語で記述された .NET プログラムでのみ使用できます。 開発者は、 Microsoft.SqlServer.XEvents.Linq 名前空間の .NET Framework クラスを介してイベント ストリームにアクセスできます。 このターゲットは、任意のイベント セッションに暗黙的に存在します。 T-SQL を使用して追加することはできません。

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

The event data stream was disconnected because there were too many outstanding events. To avoid this error either remove events or actions from your session or add a more restrictive predicate filter to your session. ターゲットから読み取るときに event_stream エラー 25726 が発生した場合は、イベントストリームがクライアントがデータを消費するよりも速くデータでいっぱいになったことを意味します。 これにより、データベース エンジンは、データベース エンジンのパフォーマンスに影響を与えないように、イベント ストリームから切断します。

histogram ターゲット

histogramターゲットは、フィールドまたはアクション内の個別の値のイベント発生回数をカウントします。 個別の値ごとに、個別のカウント バケットが使用されます。 histogramターゲットは、受信したデータを同期的に処理します。

SOURCE_TYPE パラメーターは、histogram ターゲットの動作を制御します。

  • SOURCE_TYPE = 0データを 収集します。
  • SOURCE_TYPE = 1のデータを 収集します。 これが既定です。

SLOTS パラメーターの既定値は 256 です。 別の値を割り当てると、値は次の 2 の累乗に切り上げられます。 たとえば、SLOTS = 59 は64に丸められます。 histogramターゲットのヒストグラム スロットの最大数は 16,384 です。

ターゲットとして histogram コマンドを使うときに、予期しない結果が表示されることがあります。 一部のイベントは予想されるスロットに表示されない場合があります。一方、他のスロットでは、イベントの数が予想よりも多い場合があります。 これは、スロットにイベントを割り当てるときにハッシュ競合が発生した場合に発生する可能性があります。 これはまれですが、ハッシュ競合が発生した場合、あるスロットでカウントする必要があるイベントが別のスロットでカウントされます。 このため、特定のスロットの数が 0 と表示されるだけでイベントが発生しなかった場合は注意が必要です。

ここでは、次のシナリオを例に説明します。

  • histogramをターゲットとして使用し、イベントをobject_idでバケット化して、ストアド プロシージャの実行統計を収集するように拡張イベント セッションを設定します。
  • ストアド プロシージャ Aを実行します。 次に、ストアド プロシージャ Bを実行します。

ハッシュ関数が両方のストアド プロシージャの object_id に対して同じ値を返す場合、ヒストグラムには A が 2 回実行されますが、 B は表示されません。

個別の値の数が比較的少ない場合にこの問題を軽減するには、ヒストグラム スロットの数を予想される個別の値の二乗よりも大きく設定します。 たとえば、histogram ターゲットが SOURCE イベント フィールドに table_name 設定されていて、データベースに 20 個のテーブルがある場合、20*20 = 400 になります。 400 を超える 2 の次の累乗は 512 です。これは、この例で推奨されるスロット数です。

histogram ターゲットは、1 つのソース (イベント フィールドまたはアクション) からのデータを受け入れ、ヒストグラムを 1 つだけ含みます。 イベント セッションごとに同じ型 の複数のターゲットを追加することはできません。 ターゲットごとに複数のソースタイプを指定することはできません。 そのため、別の histogram ターゲット内のさまざまなアクションまたはイベント フィールドを追跡するには、新しいイベント セッションが必要です。

ヒストグラム ターゲットを使用してイベント セッションを作成する

histogram ターゲットとのイベント セッションを作成する例を次に示します。

Azure SQL Database または Fabric の SQL データベースでこの例を使用するには、 ON SERVERON DATABASEに置き換えます。

CREATE EVENT SESSION histogram_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
    ACTION (sqlos.system_thread_id)
)
ADD TARGET package0.histogram
(
    SET FILTERING_EVENT_NAME = N'sqlserver.lock_acquired',
        SLOTS = 16,
        SOURCE = N'sqlos.system_thread_id',
        SOURCE_TYPE = 1
);

ADD TARGET ... (SET ...)句では、ターゲット パラメーター SOURCE_TYPE1 に設定されます。つまり、histogramターゲットはアクションを追跡します。

ADD EVENT ... (ACTION ...)句は、sqlos.system_thread_id アクションをイベントに追加します。 SOURCE パラメーターは、このアクションによって収集されたシステム スレッド ID をsqlos.system_thread_idターゲットのデータ ソースとして使用するhistogramに設定されます。 この例の histogram ターゲットは、セッションがアクティブな間にロックを取得する各システム スレッドの lock_acquired イベントの数をカウントします。

イベント セッションを開始するには、次のステートメントを実行します。

ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;

SSMS で収集されたヒストグラム データを表示するには、セッション ノードを展開し、 package0.histogram ターゲットを選択します。 データは 2 列のグリッドに表示されます。 各行は、個別の値のバケットと出現回数を表します。

この例では、 histogram ターゲットによってキャプチャされたデータがどのように表示されるかを次に示します。 value 列の system_thread_id 値は値です。 たとえば、システム スレッド 6540 によって合計 236 個のロックが取得されました。

value   count
-----   -----
 6540     236
 9308      91
 9668      74
10144      49
 5244      44
 2396      28

T-SQL を使用して histogram ターゲットからデータを読み取る例を次に示します。

WITH histogram_target
AS (SELECT TRY_CAST (st.target_data AS XML) AS target_data
    FROM sys.dm_xe_sessions AS s
         INNER JOIN sys.dm_xe_session_targets AS st
             ON s.address = st.event_session_address
    WHERE s.name = 'event-session-name-placeholder'),
 histogram
AS (SELECT hb.slot.value('(@count)[1]', 'bigint') AS slot_count,
           hb.slot.value('(value/text())[1]', 'nvarchar(max)') AS slot_value
    FROM histogram_target AS ht
CROSS APPLY ht.target_data.nodes('/HistogramTarget/Slot') AS hb(slot))
SELECT slot_value,
       slot_count
FROM histogram;

event_counter ターゲット

event_counter ターゲットを使うと、特定のイベントが発生した回数をカウントできます。

event_counterターゲットにはパラメーターがなく、受信したデータを同期的に処理します。

event_counterターゲットを使用したイベントセッションを作成する

event_counter ターゲットとのイベント セッションを作成する例を次に示します。 セッションは、最初の 4 つの checkpoint_begin イベントをカウントし、その述語によってターゲットに送信されるイベントの数が 4 に制限されるため、カウントを停止します。 この例の checkpoint_begin イベントは、 CHECKPOINT コマンドを実行して生成できます。

Azure SQL Database または Fabric の SQL データベースでこの例を使用するには、 ON SERVERON DATABASEに置き換えます。

CREATE EVENT SESSION event_counter_checkpoint_begin
ON SERVER
ADD EVENT sqlserver.checkpoint_begin
(
    WHERE package0.counter <= 4
)
ADD TARGET package0.event_counter
WITH
(
    MAX_MEMORY = 4096 KB,
    MAX_DISPATCH_LATENCY = 3 SECONDS
);

イベント セッションを開始するには、次のステートメントを実行します。

ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;

SSMS で収集されたデータを表示するには、セッション ノードを展開し、 package0.event_counter ターゲットを選択します。 データは 3 列のグリッドに表示されます。 各行は、発生回数を含むイベントを表します。

この例の event_counter ターゲットによってキャプチャされたデータは、4 つのチェックポイントが発生した後にどのように表示されるかを次に示します。

package_name   event_name         count
------------   ----------------   -----
sqlserver      checkpoint_begin   4

pair_matching ターゲット

pair_matching ターゲットを使用すると、対応する終了イベントのない開始イベントを検出できます。 たとえば、一致するlock_acquired イベントがないlock_released イベントを見つけることができます。これは、実行時間の長いトランザクションがロックを保持していることを示している可能性があります。

拡張イベントは、開始イベントと終了イベントと自動的に一致しません。 代わりに、pair_matching ステートメントのCREATE EVENT SESSIONターゲット仕様で一致するロジックを定義します。 開始イベントと終了イベントが一致すると、ターゲットはペアを破棄しますが、一致しない開始イベントは保持します。

pair_matching ターゲットとのイベント セッションを作成する

この例では、 T1という名前のテーブルの例を作成し、3 つの行を挿入して、このテーブルの object_id 値を取得します。 わかりやすくするために、この例では、 tempdb データベースにテーブルを作成します。 別のデータベースを使用する場合は、次の T-SQL サンプル コードでデータベース名を調整します。

CREATE TABLE T1 (id INT PRIMARY KEY);

INSERT INTO T1 (id)
VALUES (1), (2), (3);

SELECT OBJECT_ID('T1') AS object_id;
-- object_id = 1029578706

次のイベント セッションでは、 lock_acquiredlock_releasedの 2 つのイベントが収集されます。 また、2 つのターゲットがあります。 1 つは、各イベントの発生回数を提供する event_counter ターゲットです。 もう 1 つは、開始pair_matching イベントと終了lock_acquired イベントをペアに一致させるロジックを定義するlock_released ターゲットです。

BEGIN_MATCHING_COLUMNS に割り当てられたコンマ区切りフィールドのシーケンス と END_MATCHING_COLUMNS は同じである必要があります。 コンマ区切り値で示されるフィールドの間にタブや改行文字があってはなりませんが、スペースは許されます。

イベント セッション定義では、イベント述語を使用して、イベント内のtempdbがテーブル object_idのオブジェクト ID と一致するT1 データベース内のイベントのみを収集します。 テーブルのオブジェクト ID を使用するように、 WHERE 句の述語を調整します。

Azure SQL Database または Fabric の SQL データベースでこの例を使用するには、 ON SERVERON DATABASEに置き換えます。

CREATE EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
    SET COLLECT_DATABASE_NAME = 1,
        COLLECT_RESOURCE_DESCRIPTION = 1
    ACTION (sqlserver.transaction_id)
    WHERE (database_name = 'tempdb'
           AND object_id = 1029578706)
),
ADD EVENT sqlserver.lock_released
(
    SET COLLECT_DATABASE_NAME = 1,
        COLLECT_RESOURCE_DESCRIPTION = 1
    ACTION (sqlserver.transaction_id)
    WHERE (database_name = 'tempdb'
           AND object_id = 1029578706)
)
ADD TARGET package0.event_counter,
ADD TARGET package0.pair_matching
(
    SET BEGIN_EVENT = N'sqlserver.lock_acquired',
        BEGIN_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
        END_EVENT = N'sqlserver.lock_released',
        END_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
        RESPOND_TO_MEMORY_PRESSURE = 1
)
WITH
(
    MAX_MEMORY = 8192 KB,
    MAX_DISPATCH_LATENCY = 15 SECONDS
);

イベント セッションを開始するには、次のステートメントを実行します。

ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;

T1 テーブルを更新するが、コミットしたりロールバックしたりしないトランザクションを開始します。 これにより、取得されて解放されていないロックが存在することが確実になります。

BEGIN TRANSACTION;
UPDATE T1
    SET id = id + 1;

SSMS の pair_matching_lock_acquired_released イベント セッションの各ターゲットからの出力を調べます。

event_counterターゲットには次の出力があり、1つのロックが未解放のままであることを示しています。 ただし、このターゲットには、このロックの詳細は表示されません。

package_name   event_name      count
------------   ----------      -----
sqlserver      lock_acquired   4
sqlserver      lock_released   3

pair_matchingターゲットには、簡潔にするために切り捨てられた次の出力があります。 event_counter出力で提案されているように、ペアリングされていないlock_acquiredイベントの 1 つの行が実際に表示され、イベントの詳細が表示されます。

package_name  event_name    timestamp                     associated_object_id  database_id  database_name
------------  ------------  ---------                     -------------         -----------  -------------
sqlserver    lock_acquired   2025-10-01 20:06:07.1890000  1029578706            2            tempdb

トランザクションをロールバックしてください。

ROLLBACK;

pair_matching ターゲットによって収集されたイベントにアクションを追加すると、アクション データも収集されます。 たとえば、 sqlserver.sql_text アクションによって提供される T-SQL テキストをイベントに含めることができます。 この例では、ロックを取得したクエリを収集します。

etw_classic_sync_target ターゲット

SQL Server の拡張イベントは、Windows イベント トレーシング(ETW) と連携してシステムの使用状況を監視できます。 詳細については、以下を参照してください:

この ETW ターゲットは、受信したデータを同期的に処理します。