

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://www.amazonaws.cn/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 取消查询
取消查询

如果您的查询运行时间过长或消耗过多资源，请取消该查询。例如，创建一个门票卖家列表，其中包含卖家名称和售出门票数。下面的查询从 `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\$13766)。这称为笛卡尔联接，我们不建议使用。结果超过 1.88 亿行，并且运行时间很长。

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

要查找会话 ID，请启动新会话并查询 STV\$1RECENTS 表，如上一步所示。以下示例显示了如何使结果更易读。为此，请使用 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](https://docs.amazonaws.cn/redshift/latest/dg/r_CANCEL.html)。

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

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

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

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

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