■ はじめに
小ネタ、、、 だと思ったが、実験などして意外と実りがあった。 クエリを中断(Abort; アボート)する必要があり 長時間掛かるクエリの場合、 Web UI上でできないこともあるので調べてみた
目次
【1】クエリの中断の仕方 1)実行クエリがWebUI上で実行中のままの場合 2)Web UI上に「Abort」ボタンが残っていない場合 【2】キャンセル処理する関数 1)SYSTEM$CANCEL_QUERY 2)SYSTEM$CANCEL_ALL_QUERIES 3)使用上の注意 【3】実験 1)準備 2)実行例
【1】クエリの中断の仕方
1)実行クエリがWebUI上で実行中のままの場合
* 「Abort」ボタン(赤字)を押下するだけ
2)Web UI上に「Abort」ボタンが残っていない場合
長時間掛かるクエリの場合、セッション切れなどで 1)の 「Abort」ボタンが表示されていないケース => 以下「【2】キャンセル処理する関数」を使うとよさそう
手順
[1] Snowflake の Web UI (Classic Web Interface) にログイン [2] 画面上部の[History]タブを選択し「履歴画面」を表示する [3] Filter 欄を「Status:Running」にし中止対象のクエリ探し そのQuery IDのリンクをクリック [4] Query ID / Session ID が表示されるので、コピー => セッション内のクエリ全て中断させたいなら、「Session ID」 => e.g. Session ID: 1065153872298 => クエリ単体を中断させたいなら、「Query ID」 => e.g. Query ID: 'd5493e36-5e38-48c9-a47c-c476f2111ce5' [5] キャンセル処理する関数を実行する =>SELECT SYSTEM$CANCEL_QUERY('d5493e36-5e38-48c9-a47c-c476f2111ce5'); =>SELECT SYSTEM$CANCEL_ALL_QUERIES(1065153872298);
【2】キャンセル処理する関数
1)SYSTEM$CANCEL_QUERY
https://docs.snowflake.com/ja/sql-reference/functions/system_cancel_query.html
-- 指定されたクエリ(またはステートメント)が -- 現在アクティブ/実行中の場合、キャンセルします SELECT SYSTEM$CANCEL_QUERY('<query_id>');
実行例
SELECT SYSTEM$CANCEL_QUERY('d5493e36-5e38-48c9-a47c-c476f2111ce5');
2)SYSTEM$CANCEL_ALL_QUERIES
* セッションIDを指定して、全てのクエリをキャンセルできる
https://docs.snowflake.com/ja/sql-reference/functions/system_cancel_all_queries.html
-- 指定されたセッションのすべてのアクティブ/実行中のクエリをキャンセル SELECT SYSTEM$CANCEL_ALL_QUERIES( <session_id> );
実行例
-- !! 注意 !! -- シングルクォーテーションで指定していない SELECT SYSTEM$CANCEL_ALL_QUERIES(1065153872298);
3)使用上の注意
* 以下の2点。 [1] SELECT文で実行 [2] CANCEL_ALL_QUERIES/CANCEL_ALL_QUERIES の引数の違い
[1] SELECT文で実行
* 「実行例」のように実行していく => SELECT SYSTEM$CANCEL_QUERY('d5493e36-5e38-48c9-a47c-c476f2111ce5'); => SELECT SYSTEM$CANCEL_ALL_QUERIES(1065153872298); # はじめ、SYSTEM$CANCEL_QUERY()で実行してエラーがでて焦った...
[2] CANCEL_ALL_QUERIES/CANCEL_ALL_QUERIES の引数の違い
* SYSTEM$CANCEL_QUERY => クエリID(文字列)なのでシングルクォーテーションは必要 => SELECT SYSTEM$CANCEL_QUERY('d5493e36-5e38-48c9-a47c-c476f2111ce5'); * SYSTEM$CANCEL_ALL_QUERIES => セッションID(数字)なのでシングルクォーテーションは不要 => SELECT SYSTEM$CANCEL_ALL_QUERIES(1065153872298);
【3】実験
* 疑似的に重い処理を行い、キャンセルできるか試した
!!注意!!
* 今回の処理をそのまま実行すると、 無限ループに近い形なので自己責任で、、、 => 実際に行って色々な気づきができたので 個人的には良かったが、焦ったので、、、
1)準備
* 疑似的に重い処理を作る(重い処理が用意できるならSkip可能)
https://docs.snowflake.com/ja/sql-reference/snowflake-scripting/loop.html
[1] ダミーテーブル作成
create table dummy_data (id integer);
[2] 時間が掛かるプロシージャを作成
-- 凄いでかいループカウントで時間が掛かるプロシージャを作成 create procedure heavy_process() returns integer language sql as $$ declare counter integer; begin counter := 0; loop counter := counter + 1; -- !!注意!!この数は、環境によって調整を、、、 if (counter > 100000000000) then break; end if; insert into dummy_data (id) values (:counter); end loop; return counter; end; $$ ;
2)実行例
[1] 重い処理を実行
-- プロシージャを実行(重い)
call heavy_process();
[2] Query ID / Session ID を調べる
[i] 画面上部の[History]タブを選択し「履歴画面」を表示する [ii] Filter 欄を「Status:Running」にし中止対象のクエリ探し そのQuery IDのリンクをクリック [iii] Query ID / Session ID が表示されるので、コピー => 今回はセッションIDで「1065153872298」
[3] キャンセル処理する関数を実行する
SELECT SYSTEM$CANCEL_ALL_QUERIES(1065153872298);
[4] キャンセルできたか確認する
[i] 画面上部の[History]タブを選択し「履歴画面」を表示する [ii] 対象のクエリを探し、キャンセルできていることを確認する
関連記事
Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world ~
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ トランザクション ~
https://dk521123.hatenablog.com/entry/2022/12/19/221551
【Snowflake】ストアド ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/12/11/202904