直方图目标
直方图目标基于事件数据对发生的特定事件类型进行分组。 事件的分组是基于指定的事件列或操作进行计数的。 您可以使用直方图目标来排除性能问题。 通过标识哪些事件发生的频率最高,您就可以找到可能引起性能问题的“作用点”。
下表描述了可用于配置直方图目标的选项。
选项 | 允许的值 | 说明 |
---|---|---|
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)