クエリ エディターを使用した拡張イベント セッションの作成
拡張イベント セッションを作成するには、クエリ エディターを使用するか、オブジェクト エクスプローラーでセッションを作成します。 オブジェクト エクスプローラーでは、拡張イベントにイベント セッション データを作成、変更、および表示するための 2 つのユーザー インターフェイスが用意されています。その 1 つはイベント セッションの作成プロセスを指示に従って操作するウィザードで、もう 1 つは詳細な構成オプションを設定する [新しいセッション] の UI です。 拡張イベント セッションを作成して SQL Server のトレースを診断できます。これにより次のような問題を解決できます。
最も高価なクエリを見つける
ラッチ競合の根本的な原因を見つける
他のクエリをブロックしているクエリを見つける
クエリの再コンパイルにより、過剰な CPU 使用率をトラブルシューティングする
デッドロックのトラブルシューティング
新規セッション ウィザードを使用して拡張イベント セッションを作成する方法の詳細については、「ウィザードを使用した拡張イベント セッションの作成 (オブジェクト エクスプローラー)」を参照してください。 [新しいセッション] の UI を使用して拡張イベント セッションを作成する方法の詳細については、「[新しいセッション] ダイアログを使用した拡張イベント セッションの作成」を参照してください。
権限
拡張イベント セッションを作成するには、ALTER ANY EVENT SESSION 権限が必要です。
クエリ エディターを使用した拡張イベント セッションの作成
拡張イベント セッションを作成するには
次の手順は、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
新しいクエリ ウィンドウで、イベント セッションを作成するためのステートメントを追加します。session_name の部分は、使用するセッションの名前に置き換えてください。
重要 手順 2. ~ 6. は、イベント セッションの定義を断片的に記述しています。 実際には、すべてのステートメントを単一のクエリ ウィンドウに追加してから実行することになります。 サンプル全体については、このトピックの「使用例」のセクションを参照してください。
CREATE EVENT SESSION session_name ON SERVER
監視するイベントを package_name.event_name の形式で追加します。 各イベントについて、次のような行を追加します。
ADD EVENT package_name.event_name
例:
ADD EVENT sqlserver.file_read_completed, ADD EVENT sqlserver.file_write_completed
(省略可能) イベントを追加すると、実行するアクションを追加できます。 また、述語を追加することもできます。 述語は、イベント情報がどのようなときにターゲットによって消費されるかの基準を確立する目的で使用されます。 アクションは、ACTION 句を使用して追加します。述語は、WHERE 句を使用して追加します。 たとえば、sqlserver.file_read_completed イベントについて、ファイル ID が 1 と等しいときに Transact-SQL テキストをキャプチャするようなアクションと述語を追加するには、次のステートメントを追加します。
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
適切なターゲットを追加します。イベント データはターゲットで処理され、消費されます。 次の形式を使用します。
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 拡張イベント ターゲット」を参照してください。
他にも必要な構成オプションがあれば、確認して追加します。 たとえば、イベント保存モード、イベントをメモリにバッファリングする時間、SQL Server の起動時にイベント セッションを自動的に開始するかどうかなどのオプションを構成することができます。 これらのオプションについては、「ALTER EVENT SESSION (Transact-SQL)」のトピックに説明があります。これらのオプションを指定しなかった場合は、既定値が割り当てられる点に注意してください。
セッションを開始します。
注 セッションの結果を表示する方法の詳細については、オンライン ブックの「SQL Server 拡張イベント ターゲット」ノードで、使用しているターゲットの種類に応じたトピックを参照してください。
次の例では、IOActivity という名前の拡張イベント セッションを作成します。キャプチャする情報は次のとおりです。
ファイル読み取り完了イベントのデータ (関連付けられている Transact-SQL テキストを含む)。ファイル ID が 1 に等しいファイルの読み取りが対象となります。
ファイル書き込み完了イベントのデータ。
ログ キャッシュ内のデータが物理ログ ファイルに書き込まれたときに発生するイベントのデータ。
このセッションでは、出力結果がファイル ターゲットに送信されます。
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)