我为 Amazon Redshift 查询设置了工作负载管理 (WLM) 超时,但查询在此期限到期后继续运行
简述
WLM 超时仅适用于查询运行阶段的查询。如果 WLM 没有按预期终止查询,通常是由于查询在执行阶段以外的阶段花了时间。例如,查询可能会等待解析或重写,等待锁定,或者等待 WLM 队列中的某个位置。或者,查询可能进入了返回阶段或跳到另一个队列。
解决方法
查询 STV_RECENTS 时,starttime 是查询进入集群的时间,而不是查询开始运行的时间。当查询在 STV_RECENTS 中处于 Running 状态时,它在系统中处于活动状态。但是,此查询在进入 STV_INFLIGHT 状态之前不会使用计算节点资源。有关查询计划的更多信息,请参阅查询计划和执行工作流。
要查看正在运行的查询的状态,查询 STV_INFLIGHT 而不是 STV_RECENTS:
select \* from STV\_INFLIGHT where query = your\_query\_id;
有关查询阶段的更多信息,请运行以下查询:
select \* from SVL\_QUERY\_REPORT where query = your\_query\_id ORDER BY segment, step, slice;
使用 STV_EXEC_STATE 表查找在计算节点上正在运行的任何查询的当前状态:
select \* from STV\_EXEC\_STATE where query = your\_query\_id ORDER BY segment, step, slice;
以下是查询运行时间可能好像超过了 WLM 超时期限的常见原因。
查询处于“返回”阶段
有两个“返回”步骤。检查 STV_EXEC_STATE,查看查询是否已进入以下返回阶段之一:
正在进行回滚
数据操作语言 (DML) 操作可能会遇到错误并回滚。此操作可能不会显示“已停止”,因为它已经在回滚过程中。您可以查询 STV_EXEC_STATE 来查看回滚情况,并可以在 STL_UNDONE 中找到更多信息。
查询在花时间排队等待运行
查询 STV_WLM_QUERY_STATE 来查看排队时间:
select \* from STV\_WLM\_QUERY\_STATE where query = your\_query\_id;
查询在等待锁定
如果查询在 STV_RECENTS 中可见,但在 STV_WLM_QUERY_STATE 中不可见,说明查询可能在等待锁定,还未进入队列。有关更多信息,请参阅如何在 Amazon Redshift 中检测和释放锁定?
有查询跳到了另一个队列
如果有读取查询达到当前 WLM 队列的超时限制,此查询将被推送到下一个 WLM 队列。或者,如果有指定跳转操作的查询监控规则,查询将被推送到下一个 WLM 队列。要确认查询是否跳到下一个队列,根据您的场景完成以下查询:
要阻止查询跳到另一个队列,配置 WLM 队列或 WLM 查询监控规则。有关查询跳转的更多信息,请参阅 WLM 查询队列跳转。
网络或防火墙问题
如果 Amazon Redshift 服务器在与您的客户端通信时出现问题,服务器可能会卡在“返回客户端”状态。检查是否与网络组件发生冲突,如入站本地防火墙设置、出站安全组规则或出站网络访问控制列表(网络 ACL)规则。有关更多信息,请参阅从 Amazon EC2 外部连接 -- 防火墙超时问题。
出现集群问题
集群本身的问题(如硬件问题)可能会导致查询冻结。当查询由于群集问题冻结时,集群会处于“硬件故障”状态。要恢复单节点集群,还原快照。在多节点集群中,故障节点会被自动替换。
相关信息
调整查询性能
分析和改进查询