次の方法で共有


SQL Server の拡張イベントに対するシステム ビューからの SELECT と JOIN

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance

この記事では、SQL Server および Azure SQL Database の拡張イベントに関連するシステム ビューの 2 つのセットについて説明します。 以下のことについて説明します。

  • さまざまなシステム ビューを結合 (JOIN) する方法。
  • システム ビューから特定の種類の情報を選択 (SELECT) する方法。
  • さまざまな技術的観点からの同じイベント セッション情報の表現方法。各観点の理解を助けます。

ほとんどの例は SQL Server 用に作成されています。 ただし、少し編集すれば SQL Database でも動作します。

A. 基礎的な情報

拡張イベントには 2 セットのシステム ビューがあります。

カタログ ビュー:

  • カタログ ビューには、 CREATE EVENT SESSION または SSMS の同等の UI によって作成された各イベント セッションの 定義についての情報が格納されます。 ただし、これらのビューでは、セッションの実行が開始しているかどうかはわかりません。

    • たとえば場合は、SSMS の オブジェクト エクスプローラー でイベント セッションが定義されていないことが示されている場合、ビュー sys.server_event_session_targets に対する SELECT からは行が返りません。
  • 名前プレフィックス:

    • sys.server_event_session* は、SQL Server での名前プレフィックスです。
    • sys.database_event_session* は、SQL Database での名前プレフィックスです。

動的管理ビュー (DMV):

  • 実行中のイベント セッションの 現在のアクティビティ に関する情報が格納されます。 ただし、これらの DMV はセッションの定義に関してはほとんどわかりません。

    • 現在すべてのイベント セッションが停止されていても、さまざまなパッケージがサーバー起動時にアクティブなメモリに読み込まれるので、ビュー sys.dm_xe_packages に対する SELECT からは行が返ります。
    • 同じ理由から、sys.dm_xe_objects sys.dm_xe_object_columns も行を返します。
  • 拡張イベント DMV の名前プレフィックス:

    • sys.dm_xe_* は、SQL Server での名前プレフィックスです。
    • sys.dm_xe_database_* は、一般に SQL Database での名前プレフィックスです。

アクセス許可:

システム ビューの SELECT を行うには、次の権限が必要です。

  • VIEW SERVER STATE - Microsoft SQL Server の場合。
  • VIEW DATABASE STATE - Azure SQL Database の場合。

B. カタログ ビュー

このセクションでは、同じ定義済みイベント セッションを 3 つの異なる技術で示して関連付けます。 セッションは定義されていて SQL Server Management Studio (SSMS.exe) の オブジェクト エクスプローラー に表示されますが、現在は実行していません。

予期しない障害を防ぐため、 SSMS の最新の更新プログラムを毎月インストールしてください。

拡張イベントのカタログ ビューに関するリファレンス ドキュメントについては、「 拡張イベント カタログ ビュー (Transact-SQL)」をご覧ください。

 

このセクション B のシーケンス:

  • B.1 SSMS UI パースペクティブ

    • SSMS UI を使用してイベント セッションの定義を作成します。 スクリーンショットで手順を示します。
  • B.2 Transact-SQL パースペクティブ

    • SSMS コンテキスト メニューを使用して、定義済みのイベント セッションを Transact-SQL の同等の CREATE EVENT SESSION ステートメントにリバース エンジニアリングします。 T-SQL は、SSMS のスクリーンショットでの選択と完全に一致します。
  • B.3 カタログ ビュー SELECT JOIN UNION パースペクティブ

    • イベント セッションに対してシステム カタログ ビューから T-SQL の SELECT ステートメントを実行します。 結果は、 CREATE EVENT SESSION ステートメントでの指定と一致します。

 

B.1 SSMS UI パースペクティブ

SSMS の オブジェクト エクスプローラーで、 [管理][拡張イベント]>[セッション]を右クリックして [新しいセッション]>[管理]」をご覧ください。

大きい [新しいセッション] ダイアログの最初の [全般]セクションで、 [サーバーの起動時にイベント セッションを開始する]がオンになっています。

新しいセッション > 全般、サーバーの起動時にイベント セッションを開始します。

次に、[イベント] セクションでは [lock_deadlock] イベントが選択されています。 このイベントに対して、3 つの アクション が選択されています。 これは [構成] ボタンがクリックされたことを意味し、クリックされた後でボタンはグレーになっています。

新しいセッション > イベント、グローバルフィールド (アクション)

次に、同じ [イベント]>[構成] セクションでは、resource_typePAGE に設定されています。 これは、resource_type の値が PAGE 以外の場合はイベント データがイベント エンジンからターゲットに送信されないことを意味します。

データベース名とカウンターの述語フィルターを確認します。

新しいセッション > イベント、述語フィールドのフィルタリング (アクション)

次に、[データ ストレージ] セクションでは、[event_file] がターゲットとして選択されています。 さらに、[ファイル ロールオーバーを有効にする] オプションがオンになっています。

新しいセッション > データ ストレージ、eventfile_enablefileroleover

最後に、[詳細] セクションでは、[ディスパッチの最大待機時間] の値が 4 秒に短縮されています。

新しいセッション>の詳細、最大ディスパッチ待機時間

以上で、SSMS UI でのイベント セッションの定義は終わりです。

B.2 Transact-SQL パースペクティブ

イベント セッション定義の作成方法にかかわらず、SSMS UI では、セッションを完全に一致する Transact-SQL スクリプトにリバース エンジニアリングできます。 前に示した [新しいセッション] のスクリーンショットで示されている指定と、次に示す生成された T-SQL CREATE EVENT SESSION スクリプトの句を比較してください。

イベント セッションをリバース エンジニアリングするには、 オブジェクト エクスプローラー でセッション ノードを右クリックし、 [セッションをスクリプト化]>[CREATE]>[クリップボード]」をご覧ください。

SSMS でリバース エンジニアリングすることにより、次の T-SQL スクリプトが作成されます。 次のスクリプトは空白のみを使用して手作業で整形されています。

CREATE EVENT SESSION [event_session_test3]
	ON SERVER  -- Or, if on Azure SQL Database, ON DATABASE.

	ADD EVENT sqlserver.lock_deadlock
	(
		SET
			collect_database_name = (1)
		ACTION
		(
			package0  .collect_system_time,
			package0  .event_sequence,
			sqlserver .client_hostname
		)
		WHERE
		(
			[database_name]           = N'InMemTest2'
			AND [package0].[counter] <= (16)
			AND [resource_type]       = (6)
		)
	)

	ADD TARGET package0.event_file
	(
		SET
			filename           = N'C:\Junk\event_session_test3_EF.xel',
			max_file_size      = (20),
			max_rollover_files = (2)
	)

	WITH
	(
		MAX_MEMORY            = 4096 KB,
		EVENT_RETENTION_MODE  = ALLOW_SINGLE_EVENT_LOSS,
		MAX_DISPATCH_LATENCY  = 4 SECONDS,
		MAX_EVENT_SIZE        = 0 KB,
		MEMORY_PARTITION_MODE = NONE,
		TRACK_CAUSALITY       = OFF,
		STARTUP_STATE         = ON
	);

T-SQL パースペクティブは以上です。

B.3 カタログ ビュー SELECT JOIN UNION パースペクティブ

次に示す T-SQL の SELECT ステートメントは長いですが、複数の小さい SELECT が UNION でまとめられているためです。 どの小さい SELECT もそれだけで実行できます。 小さい SELECT は、さまざまなシステム カタログ ビューを JOIN する方法を示しています。

SELECT
		s.name        AS [Session-Name],
		'1_EVENT'     AS [Clause-Type],
		'Event-Name'  AS [Parameter-Name],
		e.name        AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name         AS [Session-Name],
		'2_EVENT_SET'  AS [Clause-Type],
		f.name         AS [Parameter-Name],
		f.value        AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id

		JOIN  sys.server_event_session_fields   As f

			ON  f.event_session_id = s.event_session_id
			AND f.object_id        = e.event_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name              AS [Session-Name],
		'3_EVENT_ACTION'    AS [Clause-Type],

		a.package + '.' + a.name
		                    AS [Parameter-Name],

		'(Not_Applicable)'  AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id

		JOIN  sys.server_event_session_actions  As a

			ON  a.event_session_id = s.event_session_id
			AND a.event_id         = e.event_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name                AS [Session-Name],
		'4_EVENT_PREDICATES'  AS [Clause-Type],
		e.predicate           AS [Parameter-Name],
		'(Not_Applicable)'    AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name              AS [Session-Name],
		'5_TARGET'          AS [Clause-Type],
		t.name              AS [Parameter-Name],
		'(Not_Applicable)'  AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_targets  AS t

			ON  t.event_session_id = s.event_session_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name          AS [Session-Name],
		'6_TARGET_SET'  AS [Clause-Type],
		f.name          AS [Parameter-Name],
		f.value         AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_targets  AS t

			ON  t.event_session_id = s.event_session_id

		JOIN  sys.server_event_session_fields   As f

			ON  f.event_session_id = s.event_session_id
			AND f.object_id        = t.target_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name               AS [Session-Name],
		'7_WITH_MAX_MEMORY'  AS [Clause-Type],
		'max_memory'         AS [Parameter-Name],
		s.max_memory         AS [Parameter-Value]
	FROM
		      sys.server_event_sessions  AS s
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name                  AS [Session-Name],
		'7_WITH_STARTUP_STATE'  AS [Clause-Type],
		'startup_state'         AS [Parameter-Name],
		s.startup_state         AS [Parameter-Value]
	FROM
		      sys.server_event_sessions  AS s
	WHERE
		s.name = 'event_session_test3'

ORDER BY
	[Session-Name],
	[Clause-Type],
	[Parameter-Name]
;

出力

次の表は、前の SELECT JOIN UNION を実行した場合の出力を示しています。 出力のパラメーターの名前と値は、前の CREATE EVENT SESSION ステートメントと対応します。

Session-Name Clause-Type Parameter-Name Parameter-Value
event_session_test3 1_EVENT Event-Name lock_deadlock
event_session_test3 2_EVENT_SET collect_database_name 1
event_session_test3 3_EVENT_ACTION sqlserver.client_hostname (Not_Applicable)
event_session_test3 3_EVENT_ACTION sqlserver.collect_system_time (Not_Applicable)
event_session_test3 3_EVENT_ACTION sqlserver.event_sequence (Not_Applicable)
event_session_test3 4_EVENT_PREDICATES ([sqlserver].[equal_i_sql_unicode_string]([database_name],N'InMemTest2') AND [package0].[counter]<=(16)) (Not_Applicable)
event_session_test3 5_TARGET event_file (Not_Applicable)
event_session_test3 6_TARGET_SET filename C:\Junk\event_session_test3_EF.xel
event_session_test3 6_TARGET_SET max_file_size 20
event_session_test3 6_TARGET_SET max_rollover_files 2
event_session_test3 7_WITH_MAX_MEMORY max_memory 4096
event_session_test3 7_WITH_STARTUP_STATE startup_state 1

以上でカタログ ビューのセクションは終わりです。

C: 動的管理ビュー (DMV)

次に DMV について説明します。 ここでは、それぞれが特定の目的でビジネスに役立つ Transact-SQL SELECT ステートメントをいくつか示します。 さらに、新しい用途のために DMV を JOIN する方法を示します。

DMV のリファレンス ドキュメントについては、「 拡張イベントの動的管理ビュー」をご覧ください。

特に記述していない限り、以下の SELECT からの実際の出力行は SQL Server 2016 のものです。

セクション C で示す DMV の SELECT の一覧:

C.1 すべてのパッケージのリスト

拡張イベントの領域で使用できるすべてのオブジェクトは、システムに読み込まれるパッケージから取得されます。 次の SELECT はすべてのパッケージとその説明をリストします。

SELECT  --C.1
		p.name         AS [Package],
		p.description  AS [Package-Description]
	FROM
		sys.dm_xe_packages  AS p
	ORDER BY
		p.name;

出力

パッケージのリストです。

パッケージ Package-Description
ファイル ストリーム (filestream) SQL Server FILESTREAM と FileTable の拡張イベント
package0 既定のパッケージ。 すべての標準の型、マップ、比較演算子、アクション、およびターゲットが含まれています
qds クエリ ストアの拡張イベント
SecAudit セキュリティ監査イベント
sqlclr SQL CLR の拡張イベント
sqlos SQL オペレーティング システムの拡張イベント
SQLSatellite SQL サテライトの拡張イベント
sqlserver Microsoft SQL Server の拡張イベント
sqlserver Microsoft SQL Server の拡張イベント
sqlserver Microsoft SQL Server の拡張イベント
sqlsni Microsoft SQL Server の拡張イベント
ucs 統合コミュニケーション スタックの拡張イベント
XtpCompile XTP コンパイルの拡張イベント
XtpEngine XTP エンジンの拡張イベント
XtpRuntime XTP ランタイムの拡張イベント

上記の頭字語の定義:

  • clr = .NET の共通言語ランタイム
  • qds = クエリ データ ストア
  • sni = サーバー ネットワーク インターフェイス
  • ucs = ユニファイド コミュニケーション スタック
  • xtp = 大量トランザクション処理

C.2 すべてのオブジェクト タイプの数

このセクションの SELECT は、イベント パッケージに含まれるオブジェクトのタイプを表示します。 sys.dm_xe_objects に含まれるすべてのオブジェクト タイプとそれぞれの数のリストが表示されます。

SELECT  --C.2
		Count(*)  AS [Count-of-Type],
		o.object_type
	FROM
		sys.dm_xe_objects  AS o
	GROUP BY
		o.object_type
	ORDER BY
		1  DESC;

出力

オブジェクト タイプごとのオブジェクトの数です。 約 1915 個のオブジェクトがあります。

Count-of-Type object_type
1303 event
351 map
84 メッセージ
77 pred_compare
53 action
46 pred_source
28 type
17 ターゲット

C.3 使用可能なすべてのアイテムをタイプ別に並べ替える SELECT

次の SELECT は、オブジェクトごとに 1 行ずつ、約 1915 行を返します。

SELECT  --C.3
		o.object_type  AS [Type-of-Item],
		p.name         AS [Package],
		o.name         AS [Item],
		o.description  AS [Item-Description]
	FROM
		     sys.dm_xe_objects  AS o
		JOIN sys.dm_xe_packages AS p  ON o.package_guid = p.guid
	WHERE
		o.object_type IN ('action' , 'target' , 'pred_source')
		AND
		(
			(o.capabilities & 1) = 0
			OR
			o.capabilities IS NULL
		)
	ORDER BY
		[Type-of-Item],
		[Package],
		[Item];

出力

次に示すのは上の SELECT によって返されるオブジェクトの例です。

Type-of-Item パッケージ 項目 Item-Description
action package0 callstack 現在の呼び出し履歴の収集
action package0 debug_break 既定のデバッガーでプロセスを中断
action sqlos task_time 現在のタスク実行時間の収集
action sqlserver sql_text SQL テキストの収集
event qds query_store_aprc_regression クエリ ストアがクエリ プランのパフォーマンスの回帰を検出したときに発生
event SQLSatellite connection_accept 新しい接続が受け入れられたときに発生します。 このイベントは、すべての接続試行をログに記録するために役立ちます。
event XtpCompile cgen C コード生成の開始時に発生します。
map qds aprc_state クエリ ストアのプランの回帰自動修正の状態
メッセージ package0 histogram_event_required ソースの種類が 0 の場合、パラメーター 'filtering_event_name' の値が必要です。
pred_compare package0 equal_ansi_string 2 つの ANSI 文字列値間の等値演算子
pred_compare sqlserver equal_i_sql_ansi_string 2 つの SQL ANSI 文字列値間の等値演算子
pred_source sqlos task_execution_time 現在のタスク実行時間の取得
pred_source sqlserver client_app_name 現在のクライアント アプリケーション名の取得
ターゲット package0 etw_classic_sync_target Event Tracing for Windows (ETW) 同期ターゲット
ターゲット package0 event_counter イベント カウンター ターゲットを使用して、各イベントがイベント セッションに出現する回数をカウントします。
ターゲット package0 event_file event_file ターゲットを使用して、イベント データを XEL ファイルに保存します。このファイルはアーカイブし、後で分析して確認するために使用できます。 複数の XEL ファイルを結合して、個別のイベント セッションから結合されたデータを表示することができます。
ターゲット package0 histogram ヒストグラム ターゲットを使用して、イベントに関連付けられている特定のイベント データ フィールドまたはアクションに基づいてイベント データを集計します。 このヒストグラムにより、イベント セッション期間中のイベント データの分布を分析することができます。
ターゲット package0 pair_matching ペアリング ターゲット
ターゲット package0 ring_buffer 非同期のリング バッファー ターゲット
type package0 xml 整形式の XML フラグメント

C.4 イベントに使用できるデータ フィールド

次の SELECT は、イベント タイプに固有のすべてのデータ フィールドを返します。

  • WHERE 句の項目 column_type = 'data'に注意してください。
  • また、 o.name =の WHERE 句の値を編集する必要があります。
SELECT  -- C.4
		p.name         AS [Package],
		c.object_name  AS [Event],
		c.name         AS [Column-for-Predicate-Data],
		c.description  AS [Column-Description]
	FROM
		      sys.dm_xe_object_columns  AS c
		JOIN  sys.dm_xe_objects         AS o

			ON  o.name = c.object_name

		JOIN  sys.dm_xe_packages        AS p

			ON  p.guid = o.package_guid
	WHERE
		c.column_type = 'data'
		AND
		o.object_type = 'event'
		AND
		o.name        = '\<EVENT-NAME-HERE!>'  --'lock_deadlock'
	ORDER BY
		[Package],
		[Event],
		[Column-for-Predicate-Data];

出力

前の SELECT、WHERE o.name = 'lock_deadlock'では次の行が返されます。

  • 各行は、 sqlserver.lock_deadlock イベントのオプションのフィルターを表します。
  • 次の表示では Column-Description 列は省略されています。 その値は多くの場合 NULL です。
  • これは実際の出力です。ただし、NULL であることが多い Description 列は省略されています。
  • これらの行は object_type = 'lock_deadlock' の場所です。
パッケージ イベント Column-for-Predicate-Data
sqlserver lock_deadlock associated_object_id
sqlserver lock_deadlock database_id
sqlserver lock_deadlock database_name
sqlserver lock_deadlock deadlock_id
sqlserver lock_deadlock duration
sqlserver lock_deadlock lockspace_nest_id
sqlserver lock_deadlock lockspace_sub_id
sqlserver lock_deadlock lockspace_workspace_id
sqlserver lock_deadlock mode
sqlserver lock_deadlock object_id
sqlserver lock_deadlock owner_type
sqlserver lock_deadlock resource_0
sqlserver lock_deadlock resource_1
sqlserver lock_deadlock resource_2
sqlserver lock_deadlock resource_description
sqlserver lock_deadlock resource_type
sqlserver lock_deadlock transaction_id

C.5 sys.dm_xe_map_values とイベント フィールド

次の SELECT には、 sys.dm_xe_map_valuesという名前の巧妙なビューに対する JOIN が含まれます。

この SELECT の目的は、イベント セッションから選択できるさまざまなフィールドを表示することです。 イベント フィールドは、2 つの方法で使用できます。

  • イベントが発生するたびにターゲットに書き込まれるフィールドの値を選択する。
  • 発生したイベントをターゲットに送るかどうかをフィルター処理する。
SELECT  --C.5
		dp.name         AS [Package],
		do.name         AS [Object],
		do.object_type  AS [Object-Type],
		'o--c'     AS [O--C],
		dc.name         AS [Column],
		dc.type_name    AS [Column-Type-Name],
		dc.column_type  AS [Column-Type],
		dc.column_value AS [Column-Value],
		'c--m'     AS [C--M],
		dm.map_value    AS [Map-Value],
		dm.map_key      AS [Map-Key]
	FROM
		      sys.dm_xe_objects         AS do
		JOIN  sys.dm_xe_object_columns  AS dc

			ON  dc.object_name = do.name

		JOIN  sys.dm_xe_map_values      AS dm

			ON  dm.name = dc.type_name

		JOIN  sys.dm_xe_packages        AS dp

			ON  dp.guid = do.package_guid
	WHERE
		do.object_type = 'event'
		AND
		do.name        = '\<YOUR-EVENT-NAME-HERE!>'  --'lock_deadlock'
	ORDER BY
		[Package],
		[Object],
		[Column],
		[Map-Value];

出力

次に示すのは、実際には 153 行ある前記の T-SQL SELECT からの出力のサンプルです。 resource_type の行は、この記事の event_session_test3 の例で使用されている述語のフィルター処理に 関連 しています。

/***  5 sampled rows from the actual 153 rows returned.
	NOTE:  'resource_type' under 'Column'.

Package     Object          Object-Type   O--C   Column          Column-Type-Name     Column-Type   Column-Value   C--M   Map-Value        Map-Key
-------     ------          -----------   ----   ------          ----------------     -----------   ------------   ----   ---------        -------
sqlserver   lock_deadlock   event         o--c   CHANNEL         etw_channel          readonly      2              c--m   Operational      4
sqlserver   lock_deadlock   event         o--c   KEYWORD         keyword_map          readonly      16             c--m   access_methods   1024
sqlserver   lock_deadlock   event         o--c   mode            lock_mode            data          NULL           c--m   IX               8
sqlserver   lock_deadlock   event         o--c   owner_type      lock_owner_type      data          NULL           c--m   Cursor           2
sqlserver   lock_deadlock   event         o--c   resource_type   lock_resource_type   data          NULL           c--m   PAGE             6

Therefore, on your CREATE EVENT SESSION statement, in its ADD EVENT WHERE clause,
you could put:
	WHERE( ... resource_type = 6 ...)  -- Meaning:  6 = PAGE.
***/

C.6 ターゲットのパラメーター

次の SELECT は、ターゲットのすべてのパラメーターを返します。 各パラメーターには、必須かどうかを示すタグが付けられます。 パラメーターに割り当てる値によって、ターゲットの動作が変わります。

  • WHERE 句の項目 object_type = 'customizable'に注意してください。
  • また、 o.name =の WHERE 句の値を編集する必要があります。
SELECT  --C.6
		p.name        AS [Package],
		o.name        AS [Target],
		c.name        AS [Parameter],
		c.type_name   AS [Parameter-Type],

		CASE c.capabilities_desc
			WHEN 'mandatory' THEN 'YES_Mandatory'
			ELSE 'Not_mandatory'
		END  AS [IsMandatoryYN],

		c.description AS [Parameter-Description]
	FROM
		      sys.dm_xe_objects   AS o
		JOIN  sys.dm_xe_packages  AS p

			ON  o.package_guid = p.guid

		LEFT OUTER JOIN  sys.dm_xe_object_columns  AS c

			ON  o.name        = c.object_name
			AND c.column_type = 'customizable'  -- !
	WHERE
		o.object_type = 'target'
		AND
		o.name     LIKE '%'    -- Or '\<YOUR-TARGET-NAME-HERE!>'.
	ORDER BY
		[Package],
		[Target],
		[IsMandatoryYN]  DESC,
		[Parameter];

出力

次のパラメーター行は、SQL Server 2016 で前の SELECT で返された結果の一部です。

/***  Actual output, all rows, where target name = 'event_file'.
Package    Target       Parameter            Parameter-Type       IsMandatoryYN   Parameter-Description
-------    ------       ---------            --------------       -------------   ---------------------
package0   event_file   filename             unicode_string_ptr   YES_Mandatory   Specifies the location and file name of the log
package0   event_file   increment            uint64               Not_mandatory   Size in MB to grow the file
package0   event_file   lazy_create_blob     boolean              Not_mandatory   Create blob upon publishing of first event buffer, not before.
package0   event_file   max_file_size        uint64               Not_mandatory   Maximum file size in MB
package0   event_file   max_rollover_files   uint32               Not_mandatory   Maximum number of files to retain
package0   event_file   metadatafile         unicode_string_ptr   Not_mandatory   Not used
***/

C.7 target_data 列を XML にキャストする DMV SELECT

この DMV SELECT は、アクティブなイベント セッションのターゲットからデータ行を返します。 データは XML にキャストされており、返されたセルをクリックして SSMS で簡単に表示できます。

  • イベント セッションが停止すると、この SELECT はゼロ行を返します。
  • s.name =の WHERE 句の値を編集する必要があります。
SELECT  --C.7
		s.name,
		t.target_name,
		CAST(t.target_data AS XML)  AS [XML-Cast]
	FROM
		      sys.dm_xe_session_targets  AS t
		JOIN  sys.dm_xe_sessions         AS s

			ON s.address = t.event_session_address
	WHERE
		s.name = '\<Your-Session-Name-Here!>';

XML セルを含む唯一の出力行

次に示すのは、上記の SELECT から出力される唯一の行です。 列 XML-Cast には、SSMS が認識する XML の文字列が含まれます。 したがって、SSMS は XML-Cast セルをクリック可能にします。

次のように設定されています。

  • s.name = の値には、 checkpoint_begin イベントのイベント セッションが設定されています。
  • ターゲットは ring_bufferです。
name                              target_name   XML-Cast
----                              -----------   --------
checkpoint_session_ring_buffer2   ring_buffer   <RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="2" eventCount="2" droppedCount="0" memoryUsed="104"><event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:23.508Z"><data name="database_id"><type name="uint32" package="package0" /><value>5</value></data></event><event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:26.975Z"><data name="database_id"><type name="uint32" package="package0" /><value>5</value></data></event></RingBufferTarget>

セルをクリックすると XML で表示される出力

XML-Cast セルをクリックすると、次の出力が表示されます。

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="2" eventCount="2" droppedCount="0" memoryUsed="104">
  <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:23.508Z">
    <data name="database_id">
      <type name="uint32" package="package0" />
      <value>5</value>
    </data>
  </event>
  <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:26.975Z">
    <data name="database_id">
      <type name="uint32" package="package0" />
      <value>5</value>
    </data>
  </event>
</RingBufferTarget>

C.8 ディスク ドライブから event_file データを取得する関数の SELECT

イベント セッションがデータを収集した後で停止されたものとします。 セッションが event_file ターゲットを使用するように定義されている場合でも、関数 sys.fn_xe_target_read_fileを呼び出すことによってデータを取得できます。

  • この SELECT を実行する前に、関数呼び出しのパスとファイル名のパラメーターを編集する必要があります。
    • セッションを再起動するたびに SQL システムが実際の .XEL ファイル名に埋め込む余分な桁に注意する必要はありません。 通常のルート名と拡張子を指定するだけです。
SELECT  --C.8
		f.module_guid,
		f.package_guid,
		f.object_name,
		f.file_name,
		f.file_offset,
		CAST(f.event_data AS XML)  AS [Event-Data-As-XML]
	FROM
		sys.fn_xe_file_target_read_file(

			'\<YOUR-PATH-FILE-NAME-ROOT-HERE!>*.xel',
			--'C:\Junk\Checkpoint_Begins_ES*.xel',  -- Example.

			NULL, NULL, NULL
		)  AS f;

関数の SELECT FROM によって返される出力行

次に示すのは、前記の関数の SELECT FROM によって返される行です。 右端の XML 列には、イベント発生についての具体的なデータが含まれます。

module_guid                            package_guid                           object_name        file_name                                                           file_offset   Event-Data-As-XML
-----------                            ------------                           -----------        ---------                                                           -----------   -----------------
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_begin   C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5120          <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T03:30:14.023Z"><data name="database_id"><value>5</value></data><action name="session_id" package="sqlserver"><value>60</value></action><action name="database_id" package="sqlserver"><value>5</value></action></event>
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_end     C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5120          <event name="checkpoint_end" package="sqlserver" timestamp="2016-07-09T03:30:14.025Z"><data name="database_id"><value>5</value></data></event>
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_begin   C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5632          <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T03:30:17.704Z"><data name="database_id"><value>5</value></data><action name="session_id" package="sqlserver"><value>60</value></action><action name="database_id" package="sqlserver"><value>5</value></action></event>
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_end     C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5632          <event name="checkpoint_end" package="sqlserver" timestamp="2016-07-09T03:30:17.709Z"><data name="database_id"><value>5</value></data></event>

出力、1 個の XML セル

次に示すのは、上記の返された行セットの最初の XML セルの内容です。

<event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T03:30:14.023Z">
  <data name="database_id">
    <value>5</value>
  </data>
  <action name="session_id" package="sqlserver">
    <value>60</value>
  </action>
  <action name="database_id" package="sqlserver">
    <value>5</value>
  </action>
</event>