取消查询 - Amazon Redshift

取消查询

如果您的查询运行时间过长或消耗过多资源,请取消该查询。例如,创建一个门票卖家列表,其中包含卖家名称和售出门票数。下面的查询从 SALES 表和 USERS 表中选择数据,并通过在 WHERE 子句中匹配 SELLERID 和 USERID 联接这两个表。

SELECT sellerid, firstname, lastname, sum(qtysold) FROM sales, users WHERE sales.sellerid = users.userid GROUP BY sellerid, firstname, lastname ORDER BY 4 desc;

结果看起来如下所示。

sellerid | firstname | lastname | sum ----------+-----------+----------+------ 48950 | Nayda | Hood | 184 19123 | Scott | Simmons | 164 20029 | Drew | Mcguire | 164 36791 | Emerson | Delacruz | 160 13567 | Imani | Adams | 156 9697 | Dorian | Ray | 156 41579 | Harrison | Durham | 156 15591 | Phyllis | Clay | 152 3008 | Lucas | Stanley | 148 44956 | Rachel |Villarreal| 148
注意

这是一个复杂的查询。对于本教程,您无需关注此查询的构造方式。

上一查询运行几秒钟并返回 2102 行。

假设您忘记放入 WHERE 子句。

SELECT sellerid, firstname, lastname, sum(qtysold) FROM sales, users GROUP BY sellerid, firstname, lastname ORDER BY 4 desc;

结果集行数将为 SALES 表中的所有行数乘以 USERS 表中的所有行数 ((49989*3766)。这称为笛卡尔联接,我们不建议使用。结果超过 1.88 亿行,并且运行时间很长。

要取消正在运行的查询,请使用 CANCEL 命令并提供查询的会话 ID。使用 Amazon Redshift 查询编辑器 v2,在查询运行时,您可以通过选择取消按钮来取消查询。

要查找会话 ID,请启动新会话并查询 STV_RECENTS 表,如上一步所示。以下示例显示了如何使结果更易读。为此,请使用 TRIM 函数去除尾随空格并只显示查询字符串的前 20 个字符。

要确定正在运行的查询的会话 ID,请运行以下 SELECT 语句。

SELECT user_id, session_id, start_time, query_text FROM sys_query_history WHERE status='running';

结果看起来如下所示。

user_id | session_id | start_time | query_text ---------+---------------+----------------------------+---------------------------------------------------------------- 100 | 1073791534 | 2024-03-19 22:26:21.205739 | SELECT user_id, session_id, start_time, query_text FROM ...

要取消会话 ID 为 1073791534 的查询,请运行以下命令。

CANCEL 1073791534;
注意

CANCEL 命令不会停止事务。要中止或回滚事务,请使用 ABORT 或 ROLLBACK 命令。要取消与某一事务关联的查询,应先取消查询,然后再中止事务。

如果取消的查询与某一事务关联,请使用 ABORT 或 ROLLBACK 命令取消事务并放弃对数据进行的所有更改:

ABORT;

除非您以超级用户身份登录,否则只能取消您自己的查询。超级用户可以取消所有查询。

如果您的查询工具不支持并发运行查询,则另外启动一个会话来取消查询。

有关取消查询的更多信息,请参阅《Amazon Redshift 数据库开发人员指南》中的 CANCEL

使用超级用户队列取消查询

如果您的当前会话有太多查询同时运行,则您可能要等另一个查询完成之后才能运行 CANCEL 命令。在这种情况下,使用不同的工作负载管理查询队列运行 CANCEL 命令。

通过使用工作负载管理,您可以运行不同查询队列中的查询,这样就无需等待另一查询完成。工作负载管理程序会创建一个单独的队列,称为超级用户队列,可以用来进行故障排除。要使用超级用户队列,以超级用户身份登录,并使用 SET 命令将查询组设置为“superuser”。运行您的命令后,可使用 RESET 命令重置查询组。

要使用超级用户队列取消查询,请运行以下命令。

SET query_group TO 'superuser'; CANCEL 1073791534; RESET query_group;