クエリをキャンセルする - Amazon Redshift

クエリをキャンセルする

クエリの実行時間が長すぎる場合や、リソースの消費数が多すぎる場合は、クエリをキャンセルします。この例としては、チケット販売者の名前と販売済みのチケット数を記載したリストを、作成しようとしているような場合が挙げられます。以下のクエリでは、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」を参照してください。

Superuser キューを使ってクエリをキャンセルする

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

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

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

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