sql-server – 可视化SQL Server扩展事件数据
最近我一直在探索使用SQL Server中的扩展事件来帮助我对各种查询进行基准测试和优化.到目前为止,要查看事件数据,我一直在使用SSMS中的“监视实时数据”功能.
我遇到的问题是,Live Events功能似乎使用内部缓冲区,这意味着有时我需要多次执行查询才能在窗口中显示其信息.因此,我有一个由两部分组成的问题: >有没有办法解决这个延迟,让事件显示在实时Feed中? (我在本地数据库上执行此操作,因此性能不是问题) 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 解决方法警告:下面提供的大部分信息都是我在 Jonathan Keyhayias之前通过两个Pluralsight课程学到的.非常值得加入订阅的一个月费用来完成他的两门课程.首先,我认为有一些兴趣点会有所帮助(或者至多是有意义的): >当启动扩展事件会话时,它将将一部分内存分配给缓冲区空间,以存储由会话事件生成的数据.在您的会话中,它被设置为默认值4MB 现在问题中的具体要点:
除了我上面所说的,我不知道它做到了这一点.我希望事件被捕获它只是没有达到它被发送到您的实时数据查看器所需的阈值.我使用AdventureWorks2012的以下查询对此进行了测试: SELECT * FROM dbo.ErrorLog WAITFOR DELAY '00:00:01' ; GO 使用您的事件会话配置,除了我正在过滤以仅捕获本地实例上的AdventureWorks2012数据库的数据,我可以查看此会话的目标数据并查找已捕获的查询: 再次执行此查询将最终导致它被分派,数据查看器将显示一个事件.现在,如果您确实想要查看显示的所有事件,只需停止会话,缓冲区将完全分派.一旦我停止会议,我就会看到这个:
我原本以为你可以将MAX_MEMORY更改为更低的值,这表示捕获事件的缓冲区大小.但是,您在SQL Server 2012中设置此值的最低值是200KB,我使用的查询不符合该限制,导致立即调度它.我唯一能做的就是执行一个查询,该查询将导致达到缓冲区并捕获先前捕获的事件: SELECT * FROM Person.Person ORDER BY EmailPromotion DESC;
不是我目前所知道的.我建议尽快将数据输出的最佳方法是查询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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |