SQL Server 中扩展事件系统视图中的 SELECT 和 JOIN
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例
本文介绍了与 SQL Server 和 Azure SQL 数据库中的扩展事件相关的两组系统视图。 本文阐释了:
- 如何联接各种系统视图。
- 如何从系统视图中选择特定种类的信息。
- 如何从各种技术角度展示相同的事件会话信息,并以此加强对各个角度的理解。
大多数示例是针对 SQL Server 编写的。 但是只要进行少量编辑就可以使它们在 SQL 数据库上运行。
A. 基本信息
扩展事件有两组系统视图:
目录视图:
这些视图用于存储由 CREATE EVENT SESSION 或 SSMS UI 中的对等功能创建的所有事件会话的定义信息。 但是,这些视图不知道曾经是否启动运行了任何会话。
- 例如,如果 SSMS 的 对象资源管理器 显示未定义任何事件会话,则针对视图 sys.server_event_session_targets 的 SELECT 语句将不返回任何行。
名称前缀为:
- sys.server_event_session* 是 SQL Server 上的名称前缀。
- sys.database_event_session* 是 SQL 数据库上的名称前缀。
动态管理视图 (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 数据库上的名称前缀。
权限:
要对系统视图执行 SELECT 语句,需要以下权限:
- VIEW SERVER STATE - 如果是在 Microsoft SQL Server 上。
- VIEW DATABASE STATE - 如果是在 Azure SQL 数据库上。
B. 目录视图
本部分针对相同定义的事件会话匹配和关联三种不同的技术角度。 已在 SQL Server Management Studio (SSMS.exe) 的 对象资源管理器 中定义并显示会话,但是该会话当前未运行。
每月 安装 SSMS 的最新更新是明智之举,以避免意外故障。
有关扩展事件的目录视图的参考文档位于《扩展事件目录视图 (Transact-SQL)》。
B 部分的内容顺序
-
- 使用 SSMS UI 创建事件会话的定义。 显示分步屏幕截图。
-
- 使用 SSMS 上下文菜单将已定义的事件会话反向工程为等效的 Transact-SQL CREATE EVENT SESSION 语句。 T-SQL 与 SSMS 屏幕截图的选项完全对应。
-
- 从我们的事件会话的系统目录视图发出 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 脚本中的子句进行比较。
若要对事件会话进行反向工程,在“对象资源管理器”中右键单击会话节点,然后选择“编写会话脚本为”>“创建到”>“剪贴板”。
下面的 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 语句很长只是因为它 UNION 了几个小的 SELECT 语句。 任何一个小的 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 语句。 此外,这些 SELECT 语句演示了如何针对你需要的新用途将 DMV JOIN 在一起。
相关 DMV 的参考文档可从 《Extended Events Dynamic Management Views》(扩展事件动态管理视图)中获取
在本文中,以下 SELECT 语句的任何实际输出行都来自 SQL Server 2016,除非另行指定。
下面是此 DMV 小节 C 中 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-Description |
---|---|
文件流 (filestream) | 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 公共语言运行时
- qds = 查询数据存储
- sni = 服务器网络接口
- ucs = 统一通信堆栈
- xtp = 极限事务处理
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 | action |
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 | 包 | 项 | 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 | 查询存储自动计划回归校正状态 |
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 | histogram | 使用直方图目标根据特定事件数据字段或与事件关联的操作聚合事件数据。 直方图可用于分析事件会话期间事件数据的分布情况。 |
目标 | package0 | pair_matching | Pairing target |
目标 | package0 | ring_buffer | 异步环形缓冲区目标 |
type | package0 | xml | 格式正确的 XML 片段 |
C.4 查询可用于你的事件的数据字段
以下 SELECT 语句将返回特定于事件类型的所有数据字段。
- 请注意 WHERE 子句项:column_type = 'data'。
- 此外,你需要编辑 WHERE 子句 o.name = 的值。
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 语句返回,其中 o.name = 'lock_deadlock'
:
- 每一行代表针对 sqlserver.lock_deadlock 事件的可选筛选器。
- 以下显示中忽略了 [Column-Description] 列。 它的值通常为 NULL。
- 这是实际输出,但省略的“说明”列(通常为 NULL)除外。
- 这些行是 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 的复杂视图的联接。
该 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'。
- 此外,你需要编辑 WHERE 子句 o.name = 的值。
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 语句将不返回任何行。
- 你需要编辑 WHERE 子句 o.name = 的值。
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 针对函数执行 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 语句返回的行
以下是上面的针对函数执行 SELECT 语句返回的行。 最右端的 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>