メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

ステップ 6: クエリをキャンセルする

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

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

注記

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

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

ここでは、ユーザーが WHERE 句を挿入し忘れたとします。

Copy to clipboard
select sellerid, firstname, lastname, sum(qtysold) from sales, users group by sellerid, firstname, lastname order by 4 desc;

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

実行中のクエリをキャンセルするには、CANCEL コマンドにクエリの PID を指定して実行します。

プロセス ID を見つけるには、前のステップで見たように、STV_RECENTS テーブルを使用します。以下の例は、結果を読みやすくする方法を示しています。TRIM 関数を使用して末尾部分のスペースを削除し、クエリ文字列の最初の 20 文字だけを表示しています。

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

結果は以下のようになります。

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

PID 18764 のクエリをキャンセルするには、以下のコマンドを実行します。

Copy to clipboard
cancel 18764;

注記

CANCEL コマンドはトランザクションを中止させることはありません。トランザクションを中止またはロールバックするには、ABORT や ROLLBACK コマンドを使用します。トランザクションに関連付けられたクエリをキャンセルするには、まずクエリをキャンセルしてからトランザクションを中止します。

キャンセルしたクエリがトランザクションに関連付けられている場合は、ABORT または ROLLBACK コマンドを使用してトランザクションをキャンセルし、データに加えられた変更をすべて破棄してください。

Copy to clipboard
abort;

スーパーユーザー以外でサインしている場合は、自分のクエリのみをキャンセルできます。スーパーユーザーはすべてのクエリをキャンセルできます。

他のセッションからクエリをキャンセルする

お使いのクエリツールがクエリの同時実行をサポートしていない場合、クエリをキャンセルするには別のセッションを開始する必要があります。たとえば、Amazon Redshift 入門ガイド で使用しているクエリツールの SQLWorkbench では、複数クエリの同時実行をサポートしていません。SQL Workbench で別のセッションを開始するには、[File]、[New Window] の順に選択し、同じ接続パラメーターを使って接続します。その後、PID を見つけてクエリをキャンセルすることができます。

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

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

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

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

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

クエリキューの管理については、ワークロード管理の実装 を参照してください。