任务 7:取消查询 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

任务 7:取消查询

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

要取消正在运行的查询,请带查询的 PID 使用 CANCEL 命令。

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

SELECT pid, trim(user_name), starttime, substring(query,1,20) FROM stv_recents WHERE status='Running';

结果看起来如下所示。

pid | btrim | starttime | substring -------+------------+----------------------------+---------------------- 610 | adminuser | 2013-03-28 18:39:49.355918 | select sellerid, fir (1 row)

要取消 PID 为 610 的查询,请运行以下命令。

CANCEL 610;
注意

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

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

ABORT;

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

从另一个会话中取消查询

如果您的查询工具不支持并发运行查询,则另外启动一个会话来取消查询。例如,我们在《Amazon Redshift 入门指南》中使用的查询编辑器不支持多个并发查询。要使用查询编辑器启动另一个会话,请选择文件新窗口并使用相同的连接参数进行连接。然后就可以查找 PID 并取消查询。

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

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

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

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

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