sql-server – 可视化SQL Server扩展事件数据

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

我遇到的问题是,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

解决方法

警告:下面提供的大部分信息都是我在 Jonathan Keyhayias之前通过两个Pluralsight课程学到的.非常值得加入订阅一个月费用来完成他的两门课程.

首先,我认为有一些兴趣点会有所帮助(或者至多是有意义的):

>当启动扩展事件会话时,它将将一部分内存分配给缓冲区空间,以存储由会话事件生成的数据.在您的会话中,它被设置为认值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)

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...