我遇到的问题是,Live Events功能似乎使用内部缓冲区,这意味着有时我需要多次执行查询才能在窗口中显示其信息.因此,我有一个由两部分组成的问题:
>有没有办法解决这个延迟,让事件显示在实时Feed中? (我在本地数据库上执行此操作,因此性能不是问题)
>实时馈送是可视化扩展事件数据的最佳方式吗? SSMS中是否还有其他工具可以更好地适应我的用例?
UPDATE
根据要求,这是会议:
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
解决方法
首先,我认为有一些兴趣点会有所帮助(或者至多是有意义的):
>当启动扩展事件会话时,它将将一部分内存分配给缓冲区空间,以存储由会话事件生成的数据.在您的会话中,它被设置为默认值4MB
>有多个目标可供使用.这些目标在接收数据的方式上是同步的或异步的.目标文件和环形缓冲区这两个最常用的目标都是异步的. BOL article here indicates what type each target is.
> MAX_DISPATCH_LATENCY是一个配置选项,用于控制何时将事件数据分派给目标.仅对异步目标进行调度.有两个条件会导致事件数据被分派:(1)会话的内存缓冲区已满或(2)缓冲区中的事件数据超出了会话的MAX_DISPATCH_LATENCY配置选项.
>当您打开Live Data Viewer时,它会将另一个目标附加到名为“流式目标”的事件会话中.这将在调度内存缓冲区时接收实时事件流.它实际上还会将与会话关联的调度延迟更改为3秒,以便获得会话的近实时视图.
现在问题中的具体要点:
The problem that I am having is that it appears that the Live Events feature uses an internal buffer,which means that sometimes I need to execute a query several times to get its information to display in the window. I therefore have a two-part question to ask
除了我上面所说的,我不知道它做到了这一点.我希望事件被捕获它只是没有达到它被发送到您的实时数据查看器所需的阈值.我使用AdventureWorks2012的以下查询对此进行了测试:
SELECT * FROM dbo.ErrorLog WAITFOR DELAY '00:00:01' ; GO
使用您的事件会话配置,除了我正在过滤以仅捕获本地实例上的AdventureWorks2012数据库的数据,我可以查看此会话的目标数据并查找已捕获的查询:
再次执行此查询将最终导致它被分派,数据查看器将显示一个事件.现在,如果您确实想要查看显示的所有事件,只需停止会话,缓冲区将完全分派.一旦我停止会议,我就会看到这个:
1.Is there a way to get around this delay in getting the events to display in the live Feed? (I’m doing this on a local database so performance is not an issue)
我原本以为你可以将MAX_MEMORY更改为更低的值,这表示捕获事件的缓冲区大小.但是,您在sql Server 2012中设置此值的最低值是200KB,我使用的查询不符合该限制,导致立即调度它.我唯一能做的就是执行一个查询,该查询将导致达到缓冲区并捕获先前捕获的事件:
SELECT * FROM Person.Person ORDER BY EmailPromotion DESC;
2.Is the live Feed the best way to visualize Extended Events data? Is there another tool either in SSMS or not that is better adapted to my use case?
不是我目前所知道的.我建议尽快将数据输出的最佳方法是查询XML以获取ring_buffer目标并将其粉碎.我可以重复上面的例子,一旦我执行下面的查询,我就会看到这个事件.
-- 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)