はじめに
トラブルシューティングでSQLを特定して、処理は止めたい場合等はよくあると思います。
こういう時に事前にSQLを事前に準備しておくと便利です。
SQLを作成したので共有します。
そのままでも使えると思いますがお好みにカスタマイズしてご利用ください。
特定&処理停止方法
結論から書きますと、ACCOUNTADMINなどを持つ管理者ユーザで以下のSQLを実行して実行中のSQLを確認し、結果の最後の列「CANCEL_QUERY_TEXT」に表示されるSQLを実行すれば停止できます。
select SESSION_ID,
EXECUTION_STATUS,
USER_NAME,
ROLE_NAME,
WAREHOUSE_NAME,
WAREHOUSE_SIZE,
START_TIME, -- 処理開始時間
to_char(datediff(hour, START_TIME,current_timestamp)) || ':' ||
to_char(datediff(minute, START_TIME,current_timestamp) % 60, '00') || ':' ||
to_char(datediff(second, START_TIME,current_timestamp) % 60, '00')
as elapsed_time, -- 実行されてからの経過時間
BYTES_SCANNED,
DATABASE_NAME AS usage_database,
SCHEMA_NAME AS usage_schema,
QUERY_TEXT, -- 実行中のクエリ
'SELECT SYSTEM$CANCEL_QUERY(''' || QUERY_ID || ''');' as cancel_query_text
from table(INFORMATION_SCHEMA.QUERY_HISTORY()) t
where END_TIME < START_TIME
-- 完了前のSESSIONはEND_TIMESTAMPにはUNIX エポックタイムスタンプ
-- (1970-01-01 00:00:00)が入るためこれで識別する
and session_id <> current_session() -- 自sessionを除く
order by t.start_time;
上記のSQLを実行すると以下のように実行中のクエリ情報が表示されます。
まずは実行ユーザや実行時間、SQLなどを確認し、停止対象であることを確認しまず。
上の例ではFUKA_USERさんのSQLがMサイズのウェアハウスを18分以上ぶん回していることが確認できます。
最後の列「CANCEL_QUERY_TEXT」に処理停止用のQueryを出力しています。
上記で出力されたキャンセル用クエリをコピペして実行することで処理が停止されます。
少しだけ解説
実行中のクエリの特定はINFORMATION_SCHEMA.QUERY_HISTORY()
を使用します。
ソート順は処理開始時間の昇順にしていますので止めるべきものは一番上に出てきます。
SELECT句で表示する項目を絞ってますが、必要に応じてカスタマイズしてください。
参考:
https://docs.snowflake.com/ja/sql-reference/functions/query_history.html
実行中のSQLをCANCELするのは以下です。これを確認用SQLの中で一緒に生成しています。
SELECT SYSTEM$CANCEL_QUERY('<クエリID>');
参考:
https://docs.snowflake.com/ja/sql-reference/functions/system_cancel_query.html