我设置了一个扩展事件会话来跟踪注意力事件,以监视超时的过程。这是创建脚本:
CREATE EVENT SESSION [ApplicationTimeout3] ON SERVER
ADD EVENT sqlserver.attention(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack,sqlserver.username)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0))))
ADD TARGET package0.event_file(SET filename=N'D:\ExtendedEvents\ApplicationTimeout3.xel',max_file_size=(100),max_rollover_files=(5))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON)
GO
问题是,在我得到的超时中,我没有得到 sql_text。(我也没有得到 tsql_frame 或 tsql_stack)。当我执行“观看实时数据”时,它不会返回。
我确实看到了超时,它们与我在查询 sys.query_store_runtime_stats 时看到的超时同时发生(execution_type_desc = 'Aborted')。但是,我返回的字段集有限,但它们不是我需要的字段。
另外顺便说一下,通过扩展事件记录的事件比我查询 sys.query_store_runtime_stats 时看到的要多。我不知道它们是什么。
关于如何实际获取正在执行的 sql 的任何线索?我可以通过查询查询存储表来获取存储过程名称。我想获得的是调用存储过程所使用的参数。
如果您想跟踪查询超时,我发现此扩展事件更有用:
你在这里描述了它:
https://adbsql.blogspot.com/2019/11/tracking-query-timeouts-with-extended.html
注意:这是我自己的博客文章。
我几年前使用过它,所以我不是 100% 确定,但我认为你应该使用运行时参数获取查询。正如您所描述的,我也遇到了关注事件的问题。它似乎产生了虚假条目。这就是我切换到 rpc_completed 和 sql_batch_completed 的原因。