KILL QUERY ステートメントと KILL MUTATION ステートメントについて説明します。
デフォルトでは、一致する対象がない場合でも例外は発生せずに終了します。KILL QUERY については、現在の KILL ステートメントを除いた結果、WHERE 式の条件を満たす対象行が system.processes に残らない場合に、また KILL MUTATION については、WHERE 式に一致する行が system.mutations に 1 行もない場合に例外をスローさせるには、kill_throw_if_noop を true に設定します。
ON CLUSTER で実行した場合は、一致結果がホスト間で集計されないため、一致する対象がなくても例外はスローされません。
KILL QUERY
KILL クエリの WHERE 句で定義された条件を使用して、system.processes テーブルから選択されます。
例:
まず、未完了のクエリの一覧を取得する必要があります。この SQL クエリでは、実行時間が長い順に表示されます。
単一の ClickHouse ノードでの一覧:
system.processes に対する SELECT 権限が付与されていないユーザーでも、クエリ ID を指定すれば自分自身のクエリを停止できます。
KILL QUERY WHERE query_id = '<id>'。その権限も KILL QUERY 権限も持たないユーザーが、自分が実行していない
クエリの ID を指定した場合、クエリは停止されず、エラーも報告されず、結果の行も返されません。ただし、
kill_throw_if_noop が有効な場合は、
何も実行されなかったことが例外として報告されます。一方、KILL QUERY 権限を持っていてもその SELECT 権限を持たないユーザーは、SELECT 権限がないため拒否されます。
その他の WHERE 条件と ON CLUSTER には、引き続き上記の権限が必要です。
デフォルトでは、クエリの非同期バージョン (ASYNC) が使用され、クエリが停止したことの確認は待機しません。
同期バージョン (SYNC) は、すべてのクエリが停止するまで待機し、各プロセスの停止時にその情報を表示します。
レスポンスには kill_status カラムが含まれ、このカラムは次の値を取ります。
finished– クエリは正常に停止されました。waiting– クエリに停止シグナルを送信した後、その終了を待機しています。- その他の値は、クエリを停止できない理由を示します。
TEST) は、ユーザーの権限を確認し、停止対象のクエリの一覧を表示するだけです。
KILL MUTATION
長時間実行されている、または完了していない ミューテーション がある場合、ClickHouseサービスの動作状態が悪化している可能性があります。ミューテーション は非同期で実行されるため、システム上の利用可能なリソースをすべて消費してしまうことがあります。必要に応じて、次のいずれかを行ってください。- 新しい ミューテーション、
INSERT、SELECTをすべて一時停止し、ミューテーション の queue が処理を完了するまで待ちます。 - または、
KILLコマンドを送信して、これらの ミューテーション の一部を手動で停止します。
KILL クエリの WHERE 句で指定したフィルタを使用して system.mutations テーブルから選択されます。
テストクエリ (TEST) は、ユーザーの権限を確認し、停止対象のミューテーションの一覧を表示するだけです。
例:
未完了のミューテーション数の count() を取得します:
単一の ClickHouse ノードにおけるミューテーション数:
system.mutations テーブルの
is_killed=1 カラム (ClickHouse Cloud のみ) は、必ずしもそのミューテーションが完全に終了したことを意味するわけではありません。ミューテーションが is_killed=1 かつ is_done=0 の状態のまま、長時間残ることがあります。これは、別の長時間実行中のミューテーションが、強制終了されたミューテーションをブロックしている場合に発生する可能性があります。これは正常な状態です。