次の方法で共有


クエリ エディターを使用した拡張イベント セッションの作成

拡張イベント セッションを作成するには、クエリ エディターを使用するか、オブジェクト エクスプローラーでセッションを作成します。 オブジェクト エクスプローラーでは、拡張イベントには、イベント セッション データの作成、変更、および表示に使用できる 2 つのユーザー インターフェイスが用意されています。これは、イベント セッション作成プロセスをガイドするウィザードと、より高度な構成オプションを提供する新しいセッション UI です。 拡張イベント セッションを作成して SQL Server のトレースを診断できます。これにより次のような問題を解決できます。

  • 最も高価なクエリを見つける

  • ラッチ競合の根本的な原因を見つける

  • 他のクエリをブロックしているクエリを見つける

  • クエリの再コンパイルにより、過剰な CPU 使用率をトラブルシューティングする

  • デッドロックのトラブルシューティング

新しいセッション ウィザードを使用して拡張イベント セッションを作成する方法については、「ウィザードを使用して拡張イベント セッションを作成する (オブジェクト エクスプローラー)」を参照してください。 [新しいセッション] UI を使用して拡張イベント セッションを作成する方法については、「[新しいセッション] ダイアログを使用した拡張イベント セッションの作成」を参照してください。

アクセス許可

拡張イベント セッションを作成するには、ALTER ANY EVENT SESSION 権限が必要です。

クエリ エディターを使用した拡張イベント セッションの作成

拡張イベント セッションを作成するには

  1. 次の手順では、SQL Server Management Studioで クエリ エディター を使用して拡張イベント セッションを作成する方法を示します。

    セッションに使用するイベントを決めます。 利用可能なすべてのイベントをキーワードおよびチャネルと併せて表示するには、次のクエリを使用します。

    注意

    キーワードおよびチャネルの詳細については、「 SQL Server 拡張イベント パッケージ」を参照してください。

    SELECT p.name, c.event, k.keyword, c.channel, c.description FROM  
       (  
       SELECT event_package = o.package_guid, o.description,   
       event=c.object_name, channel = v.map_value  
       FROM sys.dm_xe_objects o  
       LEFT JOIN sys.dm_xe_object_columns c ON o.name = c.object_name  
       INNER JOIN sys.dm_xe_map_values v ON c.type_name = v.name   
       AND c.column_value = cast(v.map_key AS nvarchar)  
       WHERE object_type = 'event' AND (c.name = 'CHANNEL' or c.name IS NULL)  
       ) c LEFT JOIN   
       (  
       SELECT event_package = c.object_package_guid, event = c.object_name,   
       keyword = v.map_value  
       FROM sys.dm_xe_object_columns c INNER JOIN sys.dm_xe_map_values v   
       ON c.type_name = v.name AND c.column_value = v.map_key   
       AND c.type_package_guid = v.object_package_guid  
       INNER JOIN sys.dm_xe_objects o ON o.name = c.object_name   
       AND o.package_guid = c.object_package_guid  
       WHERE object_type = 'event' AND c.name = 'KEYWORD'   
       ) k  
       ON  
       k.event_package = c.event_package AND (k.event=c.event or k.event IS NULL)  
       INNER JOIN sys.dm_xe_packages p ON p.guid = c.event_package  
    ORDER BY keyword desc, channel, event  
    
  2. 新しいクエリ ウィンドウで、イベント セッションを作成するためのステートメントを追加します。 session_name の部分は、使用するセッションの名前に置き換えてください。

    重要

    手順 2. ~ 6. は、イベント セッションの定義を断片的に記述しています。 実際には、すべてのステートメントを単一のクエリ ウィンドウに追加してから実行することになります。 サンプル全体については、このトピックの「使用例」のセクションを参照してください。

    CREATE EVENT SESSION session_name   
    ON SERVER  
    
  3. 監視するイベントを package_name.event_nameの形式で追加します。 各イベントについて、次のような行を追加します。

    ADD EVENT package_name.event_name  
    

    次に例を示します。

    ADD EVENT sqlserver.file_read_completed,  
    ADD EVENT sqlserver.file_write_completed  
    
  4. (省略可能) イベントを追加すると、実行するアクションを追加できます。 また、述語を追加することもできます。 述語は、イベント情報がどのようなときにターゲットによって消費されるかの基準を確立する目的で使用されます。 アクションは、ACTION 句を使用して追加します。述語は、WHERE 句を使用して追加します。 たとえば、sqlserver.file_read_completed イベントに対して Transact-SQL テキストがキャプチャされるアクションと述語 (ファイル ID が 1) を追加するには、次のステートメントを含めます。

    ADD EVENT sqlserver.file_read_completed  
       (ACTION (sqlserver.sql_text)  
       WHERE file_id = 1),  
    
    • 利用可能なアクションを表示するには、次のクエリを使用します。

      SELECT p.name AS 'package_name', xo.name AS 'action_name', xo.description, xo.object_type  
      FROM sys.dm_xe_objects AS xo  
      JOIN sys.dm_xe_packages AS p  
         ON xo.package_guid = p.guid  
      WHERE xo.object_type = 'action'  
      AND (xo.capabilities & 1 = 0   
      OR xo.capabilities IS NULL)  
      ORDER BY p.name, xo.name  
      
    • イベントに対して利用可能な述語を表示するには、次のクエリを使用します。 event_name の部分は、述語の追加対象となるイベントの名前に置き換えてください。

      SELECT *  
      FROM sys.dm_xe_object_columns  
      WHERE object_name = 'event_name'  
      AND column_type = 'data'  
      

      次に例を示します。

      SELECT *   
      FROM sys.dm_xe_object_columns   
      WHERE object_name = 'file_read_completed'  
      AND column_type = 'data'  
      

      グローバル述語ソースを追加することもできます。 グローバル述語ソースは、あらゆる述語式で使用できます。 利用可能なグローバル述語ソースを表示するには、次のクエリを使用します。

      SELECT p.name AS package_name, xo.name AS predicate_name  
         , xo.description, xo.object_type  
      FROM sys.dm_xe_objects AS xo  
      JOIN sys.dm_xe_packages AS p  
         ON xo.package_guid = p.guid  
      WHERE xo.object_type = 'pred_source'  
      ORDER BY p.name, xo.name  
      

      たとえば、次の述語式を使用すると、最初の 5 回の発生に限定してイベント データを収集することができます。

      WHERE package0.counter <= 5  
      
  5. 適切なターゲットを追加します。イベント データはターゲットで処理され、消費されます。 次の形式を使用します。

    ADD TARGET package_name.target_name  
    

    次の例では、非同期のファイル ターゲットを追加します。

    ADD TARGET package0.asynchronous_file_target  
       (SET filename = 'c:\temp\xelog.xel', metadatafile = 'c:\temp\xelog.xem')  
    

    利用可能なターゲットを一覧表示するには、次のクエリを使用します。

    SELECT p.name AS 'package_name', xo.name AS 'target_name'  
       , xo.description, xo.object_type   
    FROM sys.dm_xe_objects AS xo  
    JOIN sys.dm_xe_packages AS p  
       ON xo.package_guid = p.guid  
    WHERE xo.object_type = 'target'  
    AND (xo.capabilities & 1 = 0  
    OR xo.capabilities IS NULL)  
    ORDER BY p.name, xo.name  
    

    注意

    ターゲットの種類については、「 SQL Server 拡張イベント ターゲット」を参照してください。

  6. 他にも必要な構成オプションがあれば、確認して追加します。 たとえば、イベント保持モード、メモリ内のイベントのバッファー期間、SQL Server開始時にイベント セッションを自動的に開始するかどうかなどのオプションを構成できます。 オプションについては、 ALTER EVENT SESSION (Transact-SQL) に関するトピックを参照してください。 これらのオプションを指定しなかった場合は、既定値が割り当てられる点に注意してください。

  7. セッションを開始します。

    注意

    セッションの結果を表示する方法の詳細については、オンライン ブックの「 SQL Server 拡張イベント ターゲット 」ノードで、使用しているターゲットの種類に応じたトピックを参照してください。

次の例では、IOActivity という名前の拡張イベント セッションを作成します。キャプチャする情報は次のとおりです。

  • ファイル ID が 1 に等しいファイル読み取りに関連する Transact-SQL テキストを含む、完了したファイル読み取りのイベント データ。

  • ファイル書き込み完了イベントのデータ。

  • ログ キャッシュ内のデータが物理ログ ファイルに書き込まれたときに発生するイベントのデータ。

このセッションでは、出力結果がファイル ターゲットに送信されます。

CREATE EVENT SESSION IOActivity  
ON SERVER  
  
ADD EVENT sqlserver.file_read_completed  
   (  
   ACTION (sqlserver.sql_text)  
   WHERE file_id = 1),  
ADD EVENT sqlserver.file_write_completed,  
ADD EVENT sqlserver.databases_log_flush  
  
ADD TARGET package0.asynchronous_file_target   
   (SET filename = 'c:\temp\xelog.xel', metadatafile = 'c:\temp\xelog.xem')  

参照

CREATE EVENT SESSION (Transact-SQL)
SQL Server 拡張イベント ターゲット
SQL Server 拡張イベント パッケージ