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

本文介绍如何识别超出为工作负载组配置的 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. 依次单击上下文菜单、最右侧的 (...) 按钮,然后选择“设置”

Workload Group Settings

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)

后续步骤