

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# クエリをキャンセルする
<a name="cancel_query"></a>

クエリの実行時間が長すぎる場合や、リソースの消費数が多すぎる場合は、クエリをキャンセルします。この例としては、チケット販売者の名前と販売済みのチケット数を記載したリストを、作成しようとしているような場合が挙げられます。以下のクエリでは、`SALES` テーブルと `USERS` テーブルからデータを選択し、WHERE 句内で SELLERID と USERID を一致させることで 2 つのテーブルを結合しています。

```
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
```

**注記**  
これは複雑なクエリです。このチュートリアルでは、このクエリの構造を理解する必要はありません。

前のクエリは数秒間で実行され、2,102 行を返しました。

ここで、WHERE 句を挿入し忘れたとします。

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

その場合、結果セットには、`SALES` テーブルのすべての行と、`USERS` テーブルのすべての行を掛け合わせた数 (49989×3766) が含まれることになります。これはデカルト結合と呼ばれ、推奨されません。この例の場合は結果が 1 億 8800 万行を超えてしまい、実行に時間がかかりすぎます。

実行中のクエリをキャンセルするには、クエリのセッション ID を指定して CANCEL コマンドを実行します。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](https://docs.aws.amazon.com/redshift/latest/dg/r_CANCEL.html)」を参照してください。**

## Superuser キューを使ってクエリをキャンセルする
<a name="cancel_query-cancel-a-query-using-the-superuser-queue"></a>

現在のセッションで同時に実行されているキューの数が非常に多い場合、他のクエリが完了するまで、CANCEL コマンドを実行できないことがあります。そのような場合、別のワークロード管理クエリキューを使用して CANCEL コマンドを実行することができます。

ワークロード管理を使用すると、クエリを別のクエリキューで実行できるため、他のキューが完了するのを待つ必要がなくなります。ワークロード管理は、Superuser キューと呼ばれる個別のキューを作成します。このキューはトラブルシューティングに使用できます。Superuser キューを使用するには、スーパーユーザーとしてログインし、SET コマンドを使用してクエリグループを「superuser」に設定します。コマンドを実行したあと、RESET コマンドを使用してクエリグループをリセットします。

superuser キューを使用してクエリをキャンセルするには、以下のコマンドを実行します。

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