下图描述了扩展事件中引入的几个新概念:
事件
事件是指代码中定义的点。此类示例包括:T-SQL 语句完成执行时的点或结束获取锁定时的点。每个事件都有一个定义的负载(该事件返回的列的集合),它是使用 ETW 模型(其中每个事件都返回一个通道和关键字作为负载的一部分)来定义的,以便能够与 ETW 集成。SQL Server 2008 最初提供 254 个定义的事件,预计在今后还会增加。
使用下列代码可以查看这些定义事件的列表:
1
2
3
4
5
|
SELECT
xp.[
name
], xo.*
FROM
sys.dm_xe_objects xo, sys.dm_xe_packages xp
WHERE
xp.[guid] = xo.[package_guid]
AND
xo.[object_type] =
'event'
ORDER
BY
xp.[
name
];
|
使用下列代码可以查找某个特定事件的负载:
1
2
3
|
SELECT
*
FROM
sys.dm_xe_object_columns
WHERE
[object_name] =
'sql_statement_completed'
;
GO
|
谓词
谓词是指在事件消耗前利用一组逻辑规则来筛选事件的方法。谓词可以很简单,如检查事件负载中的其中一个返回列是否为某个特定值(例如,通过对象 ID 来筛选“锁定-获得”事件)。
它们还具有一些高级功能,如统计会话期间某个特定事件发生的次数、仅允许事件在发生一次后消耗,或者动态更新谓词本身以抑制包含类似数据的事件的消耗。
谓词可以使用布尔逻辑来编写,以使其能够尽可能走捷径。这使得只需执行最少数量的同步处理即可确定是否需要消耗事件。
动作
动作是指在消耗某个事件前同步执行的一组命令。任何动作都可以被链接到任何事件。它们通常会收集大量数据并追加到事件负载中(如 T-SQL 堆栈或查询执行计划)或执行某个被追加到事件负载中的计算。
由于执行这些动作可能需要极高的代价,因此事件的动作仅在所有谓词都计算完毕后才执行,如果在随后确定该事件不会被消耗,则将不会有同步执行某个动作的点。使用下列代码可找到预定义动作的列表:
1
2
3
4
5
|
SELECT
xp.[
name
], xo.*
FROM
sys.dm_xe_objects xo, sys.dm_xe_packages xp
WHERE
xp.[guid] = xo.[package_guid]
AND
xo.[object_type] =
'action'
ORDER
BY
xp.[
name
];
|
目标
目标只提供一种消耗事件的方法,任何目标都可以消耗任何事件(或至少可以在目标空闲时对事件进行处理 — 如获取非审计事件的审计目标)。目标可以同步(例如,触发事件的代码等待该事件被消耗)或异步消耗事件。
目标的范围从简单的使用者(如事件文件和环缓冲区)直到能够执行事件配对操作的复杂使用者。使用下列代码可以找到可用目标的列表:
1
2
3
4
5
|
SELECT
xp.[
name
], xo.*
FROM
sys.dm_xe_objects xo, sys.dm_xe_packages xp
WHERE
xp.[guid] = xo.[package_guid]
AND
xo.[object_type] =
'target'
ORDER
BY
xp.[
name
];
|
数据包
数据包是一个用于定义扩展事件对象(如事件、动作和目标)的容器。数据包位于它所描述的模块(如可执行程序或 DLL)中。
使用扩展事件引擎注册数据包时,它所定义的全部对象都可供使用。
会话
会话是一种将多个扩展事件对象链接到一起进行处理的方法 -- 事件包含动作,将被目标所消耗。会话可链接任何注册的数据包中的对象,任何数量的会话都可以使用同一个事件、动作等。使用下列代码可查看已定义了哪些扩展事件会话:
1
2
|
SELECT
*
FROM
sys.dm_xe_sessions;
Go
|
可使用 T-SQL 命令来创建、删除、更改、停止和启动会话。可以想见,这将提供很多灵活性,甚至提供通过对会话本身所捕获的数据进行程序化分析来动态更改会话的功能。
本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1599378 ,如需转载请自行联系原作者