警告:下面提供的许多信息是我从Jonathan Keyhayias的两门Pluralsight课程中严格学到的。加上他两个课程的加号订阅,一个月的费用非常值得。
首先,我认为会有所帮助的几个兴趣点(或者最多是有趣的点):
- 当扩展事件会话启动时,它将有一部分内存分配给缓冲区空间以存储由会话事件生成的数据。在您的会话中,此设置为默认值4MB
- 有多个可用的目标。这些目标是
synchronous
或asynchronous
如何接收数据。目标文件和环形缓冲区这两个最常用的目标都是异步的。这里的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)