取消查询
如果您的查询运行时间过长或消耗过多资源,请取消该查询。例如,创建一个门票卖家列表,其中包含卖家名称和售出门票数。下面的查询从 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;