识别运行时间超过工作负载组查询执行超时时间的查询

本文提供指导,说明如何识别那些运行时间超过为工作负荷组配置的 query_execution_timeout_sec 值的查询。

Azure Synapse Analytics 提供 创建工作负荷组以隔离资源 并将 工作负荷分类到适当的工作负荷组的功能。 作为工作负荷组定义的一部分,可以将query_execution_timeout_sec配置为在取消查询之前设置允许的最大执行时间(以秒为单位)。 但是,为了防止返回部分结果,一旦查询到达执行返回阶段,将不会取消查询。

如果应停止这些查询,可以手动终止与查询关联的会话。 本文介绍有关识别这些查询的指南。

基本疑难解答信息

若要查找运行时间超过配置的执行超时且处于返回步骤阶段的查询,

或者,下面提供了一个组合查询,用于查找所有在返回步骤阶段运行时间超过其所属工作负载组所设定的最大执行时间的请求。

确定查询后,可以使用 KILL 命令手动终止查询。

查看工作负荷组配置

Azure 门户

若要查看为 Azure 门户中的工作负荷组配置的执行超时:

  1. 转到创建了相关专用 SQL 池的 Azure Synapse 工作区。
  2. 在左侧窗格中,将列出在工作区下创建的所有池类型。 在“分析池”部分下,选择“SQL 池”。
  3. 选择感兴趣的专用 SQL 池。
  4. 在左侧窗格中的“设置”下,选择“工作负载管理”。
  5. “工作负荷组” 部分下,找到感兴趣的工作负荷组。
  6. 单击最右侧的上下文菜单(...)按钮,然后选择 “设置”

工作负荷组设置

T-SQL

若要使用 T-SQL 查看工作负载组,请使用 SQL Server Management Studio (SSMS) 连接到专用 SQL 池并发出以下查询:

SELECT * FROM sys.workload_management_workload_groups;

有关详细信息,请参阅 sys.workload_management_workload_groups

查找运行时间超过特定时长的查询

T-SQL

若要查看运行时间超过配置的执行超时的查询,请使用上述工作负荷组中的超时值发出以下查询:

DECLARE @GROUP_NAME varchar(128);
DECLARE @TIMEOUT_VALUE_MS INT;

SET @GROUP_NAME = '<group_name>';
SET @TIMEOUT_VALUE_MS = '<execution_timeout_ms>';

SELECT  *
FROM    sys.dm_pdw_exec_requests
WHERE group_name = @GROUP_NAME AND status = 'Running' AND total_elapsed_time > @TIMEOUT_VALUE_MS

有关详细信息,请参阅 sys.dm_pdw_exec_requests

检查查询执行步骤

若要使用上一步的请求 ID 检查查询是否在返回作步骤中,请发出以下查询:

DECLARE @REQUEST_ID varchar(20);
SET @REQUEST_ID = '<request_id>';

SELECT * FROM sys.dm_pdw_request_steps
WHERE request_id = @REQUEST_ID AND status = 'Running' AND operation_type = 'ReturnOperation'
ORDER BY step_index;

有关详细信息,请参阅 sys.dm_pdw_request_steps

查找超出工作负载组执行时间的所有查询

若要查找返回步骤阶段中的所有请求并且运行时间超过其工作负荷组配置的执行超时时间,请发出以下查询:

SELECT DISTINCT ExecRequests.request_id, ExecRequests.session_id, ExecRequests.total_elapsed_time, 
       ExecRequests.group_name, (WorkloadGroups.query_execution_timeout_sec * 1000) AS GroupQueryExecutionTimeoutMs      
FROM sys.dm_pdw_exec_requests AS ExecRequests
JOIN sys.workload_management_workload_groups AS WorkloadGroups ON WorkloadGroups.name = ExecRequests.group_name
JOIN sys.dm_pdw_request_steps AS RequestSteps ON ExecRequests.request_id = RequestSteps.request_id
WHERE ExecRequests.status = 'Running' AND ExecRequests.total_elapsed_time > (WorkloadGroups.query_execution_timeout_sec * 1000)
       AND RequestSteps.status = 'Running' AND RequestSteps.operation_type = 'ReturnOperation'

手动终止查询

如果想要手动终止这些查询,则可以对上面标识的会话使用 KILL 命令。

KILL '<session-id>'

有关详细信息,请参阅 KILL (Transact SQL)。

后续步骤