直方图目标

直方图目标基于事件数据对发生的特定事件类型进行分组。 事件的分组是基于指定的事件列或操作进行计数的。 您可以使用直方图目标来排除性能问题。 通过标识哪些事件发生的频率最高,您就可以找到可能引起性能问题的“作用点”。

下表描述了可用于配置直方图目标的选项。

选项

允许的值

说明

slots

任何整数值。 此值为可选值。

用户指定值,指示要保留的分组的最大数目。 达到此值后,将忽略那些不属于现有组的新事件。

请注意,为了提高性能,插槽号将向上舍入到 2 的下一个幂。

filtering_event_name

扩展事件会话中存在的任何事件。 此值为可选值。

用于标识事件类的用户指定值。 只有指定事件实例才会存储在桶中。 所有其他事件都被忽略。

如果指定该值,您必须使用如下格式:package_name.event_name,例如 'sqlserver.checkpoint_end'。 使用以下查询可以标识包名称:

SELECT p.name, se.event_name
FROM sys.dm_xe_session_events se
JOIN sys.dm_xe_packages p
ON se_event_package_guid = p.guid
ORDER BY p.name, se.event_name

如果不指定 filtering_event_name 值,则必须将 source_type 设置为 1(默认值)。

source_type

存储桶基于的对象的类型。 该值是可选的,如果未指定值,则使用默认值 1。

可以是下列值之一:

  • 0 = 事件

  • 1 = 操作

source

事件列或操作名称。

用作数据源的事件列或操作名称。

当为 source 指定事件列时,必须指定用于 filtering_event_name 值的事件中的列。 使用以下查询可以标识潜在列:

SELECT name FROM sys.dm_xe_object_columns
WHERE object_name = '<eventname>'
AND column_type != 'readonly'

当为 source 指定事件列时,则不必在 source 值中包括包名称。

当为 source 指定操作名称时,必须使用在此目标所用于的事件会话中为收集配置的一个操作。 若要查找操作名称的潜在值,可以查询 sys.dm_xe_sesssion_event_actions 视图的 action_name 列。

如果将操作名称作为数据源使用,则必须通过使用以下格式指定 source 值:package_name.action_name。

以下示例演示了直方图目标如何在高级别收集数据。 在此示例中,您希望使用直方图目标来计算每种等待类型中发生的等待数。 为此,您将会在定义直方图目标时指定以下选项:

  • filtering_event_name = 'wait_info'

  • source = 'wait_type'

  • source_type = 0(因为 wait_type 为事件列)

在此示例方案中,针对 wait_type 源记录了以下数据。

筛选事件名称

源列值

wait_info

file_io

wait_info

file_io

wait_info

network

wait_info

network

wait_info

sleep

等待类型值可以通过以下值和槽计数而划分为三个槽:

槽计数

file_io

2

network

2

sleep

1

直方图目标只保留指定源的事件数据。 某些情况下,事件数据可能太大而无法完全保留,这时便会截断数据。 截断事件数据后,将记录字节数并以 XML 输出方式显示出来。

将目标添加到会话

若要将直方图目标添加到扩展事件会话,在创建或更改事件会话时,您必须根据所需目标类型包括下面任一语句:

ADD TARGET package0.histogram

可以使用 SET 语句设置各种选项。 下面的示例演示了直方图目标的添加方式,将在该目标中收集 sqlserver.checkpoint_end 事件的数据。

ADD TARGET package0.histogram
(SET slots = 32, filtering_event_name = 'sqlserver.checkpoint_end', source_type = 0, source = 'database_id')

有关详细信息,请参阅查找具有最多锁定的对象使用扩展事件监视系统活动

查看目标输出

直方图目标将数据以 XML 格式序列化到一个调用程序或过程中。 目标输出不遵从任何架构。

若要查看直方图目标的输出,您可以使用下面的查询,并将 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'

以下示例演示了直方图目标的输出格式。

<Slots truncated = "0" buckets=[count]>
    <Slot count=[count] trunc=[truncated bytes]>
        <value>
        </value>
    </Slot>
</Slots>

请参阅

参考

sys.dm_xe_session_targets (Transact-SQL)

CREATE EVENT SESSION (Transact-SQL)

ALTER EVENT SESSION (Transact-SQL)

概念

SQL Server 扩展事件目标