Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

步骤 6:取消查询

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

Copy
select sellerid, firstname, lastname, sum(qtysold) from sales, users where sales.sellerid = users.userid group by sellerid, firstname, lastname order by 4 desc;

注意

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

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

假设用户忘记放入 WHERE 子句。

Copy
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 字符,从而使结果更易读。

Copy
select pid, trim(user_name), starttime, substring(query,1,20) from stv_recents where status='Running';

结果类似下面这样:

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

要取消 PID 为 18764 的查询,请发出以下命令:

Copy
cancel 18764;

注意

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

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

Copy
abort;

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

从另一会话取消查询

如果您的查询工具不支持并发运行查询,则需要另外启动一个会话来取消查询。例如 SQLWorkbench(这是我们在 Amazon Redshift 入门中使用的查询工具)不支持多个并发查询。要使用 SQLWorkbench 启动另一个会话,请选择“File”、“New Window”并使用相同的连接参数进行连接。然后就可以查找 PID 并取消查询。

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

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

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

要使用超级用户队列取消查询,请发出以下命令:

Copy
set query_group to 'superuser'; cancel 18764; reset query_group;

有关管理查询队列的信息,请参阅实施工作负载管理