SQL Server 擴充事件系統檢視表中的 SELECT 和 JOIN
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體
此文章說明 SQL Server 與 Azure SQL Database 中與擴充事件相關的兩組系統檢視表。 本文說明︰
- 如何「聯結」不同的系統檢視表。
- 如何從系統檢視表 SELECT 特定類型的資訊。
- 各種不同的技術檢視方塊如何表示相同事件的工作階段資訊,這可加強您對每種觀點的了解。
大部分的範例是針對 SQL Server 所寫。 但稍加編輯即可在 SQL Database 上執行。
A. 基本資訊
擴充事件有兩組系統檢視表:
目錄檢視:
這些檢視會儲存建立事件工作階段或 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,必須有下列權限︰
- Microsoft SQL Server 為 VIEW SERVER STATE。
- Azure SQL Database 為 VIEW DATABASE STATE。
B. 目錄檢視
本節會比對同一已定義事件工作階段的三種不同技術檢視方塊,並建立其關聯。 工作階段已定義並顯示在 SQL Server Management Studio (SSMS.exe) 的 [物件總管] 中,但此工作階段目前未執行。
最好每個月 安裝最新的 SSMS 更新,以避免發生意外的失敗。
擴充事件目錄檢視的相關參考文件位於擴充事件目錄檢視 (Transact-SQL)。
節 B 的順序:
-
- 使用 SSMS UI 建立事件工作階段的定義。 如逐步螢幕擷取畫面所示。
-
- 使用 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] 事件。 我們看到該事件已選取三個 [動作] 。 這表示已按過 [設定] 按鈕,它在按下後會變成灰色。
接下來,仍在 [事件] >[設定] 區段中,我們看到 resource_type 已設為 [PAGE] 。 這表示,只要 resource_type 值是 [PAGE] ,事件資料就會從事件引擎傳送到目標。
我們會看到資料庫名稱和計數器的其他述詞篩選。
接著在 [資料儲存區] 區段,我們看到 event_file 已被選為目標。 而且,我們還看到已選取 [啟用檔案換用] 選項。
最後,在 [進階] 區段看到 [分派延遲上限] 值減少到 4 秒。
如此即完成事件工作階段定義的 SSMS UI 檢視方塊。
B.2 TRANSACT-SQL 檢視方塊
不論事件工作階段定義是如何建立的,工作階段可從 SSMS UI 進行還原工程,還原為 TRANSACT-SQL 指令碼完全相符。 您可以檢查前面的 [新增工作階段] 螢幕擷取畫面,比較其可見的規格和下列產生 T-SQL CREATE EVENT SESSION 指令碼的子句。
若要進行事件工作階段的還原工程,請在 [物件總管] 中以滑鼠右鍵按一下您的工作階段節點,然後選擇 [編寫工作階段的指令碼為] >[CREATE 至] >[剪貼簿] 。
下列 T-SQL 指令碼是經由 SSMS 還原工程所建立。 然後,只能以空白字元的策略操作手動美化指令碼。
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 | (不適用) |
event_session_test3 | 3_EVENT_ACTION | sqlserver.collect_system_time | (不適用) |
event_session_test3 | 3_EVENT_ACTION | sqlserver.event_sequence | (不適用) |
event_session_test3 | 4_EVENT_PREDICATES | ([sqlserver].[equal_i_sql_unicode_string]([database_name],N'InMemTest2') AND [package0].[counter]<=(16)) | (不適用) |
event_session_test3 | 5_TARGET | event_file | (不適用) |
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 陳述式。 此外,SELECT 會示範如何將 DMV JOIN 在一起,以取得您想要的任何新用法。
DMV 的參考文件位於 擴充事件動態管理檢視
在本文中,除非另有指定,否則下列 SELECT 的所有實際輸出資料列皆是出自 SQL Server 2016。
以下是本節 C DMV 的 SELECT 清單:
- C.1 所有的封裝清單
- C.2 每個物件類型的計數
- C.3 SELECT 所有可用的項目依類型排序
- C.4 事件可用的資料欄位
- C.5 sys.dm_xe_map_values 和事件欄位
- C.6 目標的參數
- C.7 DMV SELECT 將 target_data 資料行轉換成 XML
- C.8 函數的 SELECT 從磁碟機擷取 event_file 資料
C.1 所有的封裝清單
所有您可以在擴充事件區域中使用的物件,都來自系統載入的封裝。 本節會列出所有封裝及其說明。
SELECT --C.1
p.name AS [Package],
p.description AS [Package-Description]
FROM
sys.dm_xe_packages AS p
ORDER BY
p.name;
輸出
以下為封裝清單。
Package | Package-Description |
---|---|
檔案資料流 | SQL Server FILESTREAM 和 FileTable 的擴充事件 |
package0 | 預設套件。 包含所有標準類型、對應、比較運算子、動作和目標 |
qds | 查詢存放區的擴充事件 |
SecAudit | 安全性稽核事件 |
sqlclr | SQL CLR 的擴充事件 |
sqlos | SQL 作業系統的擴充事件 |
SQLSatellite | SQL Satellite 的擴充事件 |
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 的 Common Language Runtime
- qds = 查詢資料存放區 (Query Data Store)
- sni = 伺服器網路介面 (Server Network Interface)
- ucs = 整合通訊堆疊 (Unified Communications Stack)
- xtp = 極端交易處理 (extreme transaction processing)
C.2 每個物件類型的計數
本節會告訴我們事件封裝包含的物件類型。 顯示 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 | message |
77 | pred_compare |
53 | 動作 |
46 | pred_source |
28 | type |
17 | 目標 |
C.3 SELECT 所有可用的項目依類型排序
下列的 SELECT 會傳回約 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 | Package | Item | Item-Description |
---|---|---|---|
動作 | package0 | callstack | 收集目前呼叫堆疊 |
動作 | package0 | debug_break | 中斷預設偵錯工具中的處理序 |
動作 | sqlos | task_time | 收集目前工作執行時間 |
動作 | sqlserver | sql_text | 收集 SQL 文字 |
event | qds | query_store_aprc_regression | 當查詢存放區偵測到查詢計畫效能低下時引發 |
event | SQLSatellite | connection_accept | 接受新連線時會發生。 此事件是用來記錄所有的連線嘗試。 |
event | XtpCompile | cgen | 在開始產生 C 程式碼時發生。 |
map | qds | aprc_state | 查詢存放區自動計畫迴歸修正狀態 |
message | package0 | histogram_event_required | 來源類型為 0 時,參數 'filtering_event_name' 必須有值。 |
pred_compare | package0 | equal_ansi_string | 兩個 ANSI 字串值之間的等號比較運算子 |
pred_compare | sqlserver | equal_i_sql_ansi_string | 兩個 SQL ANSI 字串值之間的等號比較運算子 |
pred_source | sqlos | task_execution_time | 取得目前工作的執行時間 |
pred_source | sqlserver | client_app_name | 取得目前用戶端應用程式名稱 |
目標 | package0 | etw_classic_sync_target | Windows 事件追蹤 (ETW) 同步目標 |
目標 | package0 | event_counter | 使用 event_counter 目標可計算事件工作階段中每個事件的發生次數。 |
目標 | package0 | event_file | 使用 event_file 目標可將事件資料儲存到 XEL 檔案,之後可以封存起來供未來的分析和檢閱使用。 您可合併多個 XEL 檔案,以檢視來自不同事件工作階段的合併資料。 |
目標 | package0 | 長條圖 | 使用長條圖目標可根據特定事件資料欄位或事件相關動作來彙總事件資料。 長條圖可供分析整個事件工作階段中事件資料的分佈情形。 |
目標 | 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 事件的選用篩選。
- 下列畫面省略 [資料行描述] 資料行。 其值通常為 NULL。
- 這是實際的輸出,但省略的 Description 資料行除外 (通常為 NULL)。
- 這些是 object_type = 'lock_deadlock' 的資料列。
Package | 事件 | 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 旨在顯示您可為事件工作階段選擇的許多欄位。 事件欄位有兩種用法︰
- 選擇會寫入每個發生事件目標的欄位值。
- 篩選會傳送的發生事件與從目標保留的發生事件。
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];
輸出
接下來是前述 T-SQL SELECT 實際輸出之 153 個資料列的取樣。 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 DMV SELECT 將 target_data 資料行轉換成 XML
這個 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 轉換」 包含 SSMS 了解其為 XML 的 XML 字串,。 因此 SSMS 了解應該讓「XML 轉換」資料格成為可按式項目。
為執行此作業︰
- 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 轉換」資料格是可按式項目時,即會出現下列良好的畫面。
<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 函數的 SELECT 從磁碟機擷取 event_file 資料
假設事件工作階段在收集了某些資料後停止。 如果您的工作階段已定義為使用 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>
輸出:一個 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>