事件配对目标使用每个事件中存在的一列或多列数据匹配两个事件。 许多事件都是成对出现的,例如锁的获取与释放。 事件序列配对完成后,两个事件都会被丢弃。 放弃匹配的集合可以方便地识别尚未释放的锁定获取。
通过使用事件级筛选器,配对目标只能捕获与预先设置的条件不匹配的事件。
使用事件配对目标时,可以选择两个要匹配的事件,以及一系列列来执行匹配。 此序列中的所有列都必须具有相同的类型。
下表介绍了配置事件配对的可用选项。
| 选项 | 允许的值 | DESCRIPTION |
|---|---|---|
| begin_event | 当前会话中存在的任何事件名称。 | 指定配对序列中开始事件的事件名称。 |
| 结束事件 | 当前会话中存在的任何事件名称。 | 指定配对序列中结束事件的事件名称。 |
| begin_matching_columns | 以逗号分隔的有序列名称列表。 | 用于匹配的列。 |
| 结束匹配列 | 以逗号分隔的有序列名称列表。 | 用于匹配的列。 |
| begin_matching_actions | 以逗号分隔的有序行为列表。 | 要进行匹配的动作 |
| 结束匹配操作 | 以逗号分隔的有序操作列表。 | 要执行匹配操作的行动。 |
| 响应内存压力 | 以下值之一: 0 = 不响应。 1 = 当存在内存压力时,停止向列表中添加新的孤立对象。 |
对内存事件的目标响应。 如果设置为 1 且服务器内存不足,则会删除正在维护的未配对信息。 |
| 最大孤儿数 | 指定将在目标中收集的未配对事件的总数。 达到限制后,将根据先进先出(FIFO)原则删除未配对事件。 默认值 = 10,000。 |
捕获与事件关联的所有数据并将其存储,以便将来进行配对。 此外,还会收集由操作添加的数据。 收集的事件数据存储在内存中,因此存在有限限制。 此限制基于系统容量和活动。 所使用的内存量将基于可用的系统资源,而非以最大内存量作为参数。 当这些不可用时,保留下来的未配对事件将被删除。 如果事件尚未配对并被删除,匹配事件将显示为未配对事件。
配对目标将未配对事件序列化为 XML 格式。 此格式不符合任何架构。 格式仅包含两种元素类型。 <未>配对的元素是根,其后跟随一个。 当前正在跟踪的每个未配对事件的<event>元素。 事件<>元素包含一个属性,该属性包含未配对事件的名称。
将目标添加到会话
若要将匹配目标添加到扩展事件会话,必须在创建或更改事件会话时包含以下语句:
ADD TARGET package0.pair_matching
接下来,您将使用 SET 语句,以定义开始和结束事件,以及需要匹配的操作或列。 以下示例展示了如何进行sqlserver.lock_acquired和sqlserver.lock_released事件的成对匹配的示例语法。
( SET begin_event = 'sqlserver.lock_acquired',
begin_matching_columns = 'database_id, resource_0, resource_1, resource_2, transaction_id, mode',
end_event = 'sqlserver.lock_released',
end_matching_columns = 'database_id, resource_0, resource_1, resource_2, transaction_id, mode',
respond_to_memory_pressure = 1)
有关详细信息,请参阅 确定哪些查询持有锁。
查看目标输出
若要查看对匹配目标的输出,可以使用以下查询,将 session_name 替换为事件会话的名称。
SELECT name, target_name, CAST(xet.target_data AS xml)
FROM sys.dm_xe_session_targets AS xet
JOIN sys.dm_xe_sessions AS xe
ON (xe.address = xet.event_session_address)
WHERE xe.name = 'session_name'
以下示例显示了配对目标输出格式。
<unpaired truncated = "0" matchedCount = "[matched count]" memoryPressureDroppedCount = " [lost count]">
<event name = "[event name]" package = "[package]" id= "[event ID value]" version = "[event version]">
<data name = "[column name]">
<type name = "[column type]" package = "[type package]" />
<value>[column value]</value>
<text value>[text value]</text>>
</data>
</event>
</unpaired>
另请参阅
SQL Server 扩展事件目标
sys.dm_xe_session_targets(Transact-SQL)
CREATE EVENT SESSION (Transact-SQL)
ALTER EVENT SESSION (Transact-SQL)