【Snowflake】Snowflake ~ クエリの中断 ~

■ はじめに

小ネタ、、、
だと思ったが、実験などして意外と実りがあった。

クエリを中断(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