可视化SQL Server扩展事件数据


16

最近,我一直在探索在SQL Server中使用扩展事件来帮助我进行基准测试和优化各种查询。到目前为止,要查看事件数据,我一直在使用SSMS中的“观看实时数据”功能。

我遇到的问题是,实时事件功能似乎使用了内部缓冲区,这意味着有时我需要多次执行查询才能使其信息显示在窗口中。因此,我有一个两部分的问题要问:

  1. 有没有办法解决将延迟显示在实时供稿中的这种延迟?(我正在本地数据库上执行此操作,因此性能不是问题)
  2. 实时供稿是否是可视化扩展事件数据的最佳方法?SSMS中是否有另一个工具可以更好地适应我的用例?

更新

根据要求,这里是会议:

CREATE EVENT SESSION [Simple Query Benchmarking] ON SERVER 
ADD EVENT sqlserver.sql_batch_completed(SET collect_batch_text=(1)
    ACTION(sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.sql_text)
    WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [package0].[greater_than_uint64]([duration],(1000)))) 
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=1 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO

Answers:


15

警告:下面提供的许多信息是我从Jonathan Keyhayias的两门Pluralsight课程中严格学到的。加上他两个课程的加号订阅,一个月的费用非常值得。

首先,我认为会有所帮助的几个兴趣点(或者最多是有趣的点):

  • 当扩展事件会话启动时,它将有一部分内存分配给缓冲区空间以存储由会话事件生成的数据。在您的会话中,此设置为默认值4MB
  • 有多个可用的目标。这些目标是synchronousasynchronous如何接收数据。目标文件和环形缓冲区这两个最常用的目标都是异步的。这里的BOL文章指出每个目标是什么类型
  • MAX_DISPATCH_LATENCY是一个配置选项,用于控制何时将事件数据调度到目标。仅对异步目标进行分派。有两种情况将导致调度事件数据:(1)会话的内存缓冲区已满,或者(2)缓冲区中的事件数据超出了会话的MAX_DISPATCH_LATENCY配置选项。
  • 当您打开Live Data Viewer时,它将在事件会话中附加一个名为“流媒体目标”的目标。当分配内存缓冲区时,它将接收实时事件流。实际上,它还将与会话关联的调度延迟更改为3秒,以便获得会话的近实时视图。

现在到您问题的特定要点:

我遇到的问题是,实时事件功能似乎使用了内部缓冲区,这意味着有时我需要多次执行查询才能使其信息显示在窗口中。因此,我有两个问题要问

除了上面所述,我不知道它是否可以这样做。我希望事件被捕获,只是它没有达到将事件发送到实时数据查看器所需的阈值。我使用以下来自以下查询的查询对此进行了测试AdventureWorks2012

SELECT * FROM dbo.ErrorLog
WAITFOR DELAY '00:00:01' ;
GO

使用事件会话配置,除了我要过滤以仅捕获AdventureWorks2012本地实例上数据库的数据外,我可以查看此会话的目标数据并找到捕获的查询:

在此处输入图片说明 在此处输入图片说明

再执行一次此查询将最终导致它被调度,并且数据查看器显示一个事件。现在,如果您实际上想查看所有显示的事件,则只需简单地STOP会话和缓冲区就可以了。停止会话后,我会看到以下内容:

在此处输入图片说明

1.是否有办法解决将延迟显示在实时供稿中的这种延迟?(我正在本地数据库上执行此操作,因此性能不是问题)

我以为您可以将更MAX_MEMORY改为较低的值,这将指示较小的缓冲区大小来捕获事件。但是,您可以在SQL Server 2012中将其设置为的最小值是200KB,我使用的查询不满足该限制,导致立即分派它。我唯一能做的就是最多执行一个查询,该查询将导致到达缓冲区并捕获先前捕获的事件:

SELECT *
FROM Person.Person
ORDER BY EmailPromotion DESC;

2.直播是可视化扩展事件数据的最佳方法吗?SSMS中是否有另一个工具可以更好地适应我的用例?

目前我还不知道。我建议最好尽快获取数据的最佳方法是查询ring_buffer目标XML 并将其切碎。我可以重复上面的示例,并在执行下面的查询后立即看到该事件。

-- Create XML variable to hold Target Data
DECLARE @target_data XML
SELECT  @target_data = CAST([t].[target_data] AS XML)
FROM    [sys].[dm_xe_sessions] AS s
JOIN    [sys].[dm_xe_session_targets] AS t
        ON [t].[event_session_address] = [s].[address]
WHERE   [s].[name] = N'Simple Query Benchmarking' AND
        [t].[target_name] = N'ring_buffer' ;

-- Return the full XML document
--SELECT @target_data;

--Shred XMl to get needed data
SELECT  DATEADD(hh, DATEDIFF(hh, GETUTCDATE(), CURRENT_TIMESTAMP), n.value('(@timestamp)[1]', 'datetime2')) AS [timestamp],
    n.value('(data[@name="duration"]/value)[1]', 'bigint') as duration,
    n.value('(action[@name="sql_text"]/value)[1]', 'varchar(max)') as sql_text
FROM @target_data.nodes('RingBufferTarget/event[@name=''sql_batch_completed'']') AS q(n)

在此处输入图片说明


3
很好的答案,非常详细。仅此而已,它比任何实际的讨论都更有趣。您提到了Johnathan Kehayias,我同意,他的Pluralsight课程100%值得1个月的费用。但是,他有一个博客,他在其中谈论他如何讨厌 Ring Buffer目标。那是从2014年开始的,所以也许现在已经改变了,但是读起来很有趣:sqlskills.com/blogs/jonathan/…–
Kalmino

1

.Net 4.7.2有一个修复程序,可以减少使用实时目标时事件显示的初始延迟。


2
您能否提供参考以支持您的答案?目前,您的答案还不多。
约翰aka hot2use
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.