扩展事件 - 缓慢的查询和等待

Pet*_*ter 4 sql-server event waits

我有一个扩展事件可以过滤我的慢速查询。我为其创建了以下脚本。

CREATE EVENT SESSION [SlowQueriesAndStatementsLargerThan3Seconds] ON SERVER 
ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1)
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([duration]>=(3000000))),
ADD EVENT sqlserver.sp_statement_completed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)
    WHERE ([duration]>=(3000000))),
ADD EVENT sqlserver.sql_batch_completed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([duration]>=(3000000)))
ADD TARGET package0.event_file(SET filename=N'SlowQueriesAndStatementsLargerThan3Seconds'),
ADD TARGET package0.ring_buffer
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=ON,STARTUP_STATE=ON)
GO
Run Code Online (Sandbox Code Playgroud)

我想包括我的查询在速度缓慢时正在等待的位置。我想包含它的 wait_info ,但是当我添加它时,我的跟踪充满了与其他查询无关的等待。为了跟踪等待情况,我添加了以下事件:

    CREATE EVENT SESSION [SlowQueriesAndStatementsLargerThan3Seconds] ON SERVER 
ADD EVENT sqlos.wait_info(
    ACTION(sqlos.task_elapsed_quantum,sqlos.task_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.session_id,sqlserver.sql_text)
    WHERE ([opcode]='End')),
ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1)
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([duration]>=(3000000))),
ADD EVENT sqlserver.sp_statement_completed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)
    WHERE ([duration]>=(3000000))),
ADD EVENT sqlserver.sql_batch_completed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([duration]>=(3000000)))
ADD TARGET package0.event_file(SET filename=N'SlowQueriesAndStatementsLargerThan3Seconds'),
ADD TARGET package0.ring_buffer
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=ON,STARTUP_STATE=ON)
GO
Run Code Online (Sandbox Code Playgroud)

是否可以仅包含在本例中运行 3 秒或更长时间的查询的等待?

Zik*_*ato 7

无法在扩展事件集合过滤器中使用因果关系跟踪。

\n

您可以做的是启用因果关系跟踪

\n

图形用户界面
\nGUI 启用因果关系跟踪

\n

TSQL

\n
CREATE EVENT SESSION [TestEvent] ON SERVER \n\xe2\x80\xa6\nWITH (TRACK_CAUSALITY=ON)\n
Run Code Online (Sandbox Code Playgroud)\n

然后收集所有内容并使用Attach_activity_id.guid进行过滤

\n

XE 按 guid 输出过滤器

\n

这是有道理的,因为您之前不知道 guid,因此无法使用它来过滤。由于在繁忙的实例上会生成多少wait_info事件,因此这种方式通常不可行。

\n

或者,您可以启用带有等待统计信息收集的查询存储(从 SQL Server 2017 (14.x) 开始)

\n
ALTER DATABASE <database_name>\nSET QUERY_STORE = ON ( WAIT_STATS_CAPTURE_MODE = ON );\n
Run Code Online (Sandbox Code Playgroud)\n

等待统计信息将按类别进行聚合和分组,但您可以使用查询存储来过滤特定的查询哈希或过程名称。

\n