直方图目标

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

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

选项 允许的值 说明
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 事件列或操作名称。 用作数据源的事件列或操作名称。

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

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

当为源指定事件列时,不一定要在源值中包括包名称。

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

如果将操作名称作为数据源使用,则必须使用以下格式指定源值: 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>  

另请参阅

SQL Server 扩展事件目标
sys.dm_xe_session_targets (Transact-SQL)
CREATE EVENT SESSION (Transact-SQL)
ALTER EVENT SESSION (Transact-SQL)