ミューテーションを使用した ClickHouse データの更新と削除
ClickHouse は大規模な分析ワークロード向けに最適化されていますが、状況によっては既存データを変更したり
削除したりすることも可能です。これらの操作は「ミューテーション (mutation)」と呼ばれ、ALTER TABLE コマンドを使って実行されます。
頻繁に更新を行う必要がある場合は、ClickHouse の deduplication の利用を検討してください。これを利用すると、 ミューテーションイベントを発生させることなく行の更新および/または削除が可能です。あるいは、lightweight updates や lightweight deletes を使用してください。
データの更新
テーブル内の行を更新するには、ALTER TABLE...UPDATE コマンドを使用します。
<expression> は、<filter_expr> の条件を満たす行に対してその列に設定される新しい値です。<expression> は、その列と同じデータ型であるか、CAST 演算子を使用して同じデータ型に変換可能である必要があります。<filter_expr> は、データの各行に対して UInt8(ゼロまたは非ゼロ)の値を返す必要があります。複数の UPDATE <column> ステートメントは、カンマで区切って 1 つの ALTER TABLE コマンドにまとめることができます。
例:
-
次のようなミューテーションにより、ディクショナリルックアップを使って
visitor_idsを新しいものに更新できます。 -
1 回のコマンドで複数の値を変更する方が、複数回のコマンド実行より効率的な場合があります。
-
シャーディングされたテーブルに対しては、ミューテーションを
ON CLUSTERで実行できます。
主キーまたはソートキーの一部になっている列を更新することはできません。
データの削除
ALTER TABLE コマンドを使用して行を削除します。
<filter_expr> は、各行のデータに対して UInt8 型の値を返す必要があります。
例
-
列が特定の値の配列に含まれている行を削除する:
-
このクエリでどのデータが削除されるか:
テーブル内のすべてのデータを削除するには、TRUNCATE TABLE [<database].]<table> コマンドを使用する方が効率的です。このコマンドは ON CLUSTER とともに実行することもできます。
詳細については、DELETE ステートメント のドキュメントページを参照してください。
軽量削除
行を削除するもう 1 つの方法は、軽量削除 と呼ばれる DELETE FROM 文を使用することです。削除された行には即座に削除フラグが付き、その後のすべてのクエリから自動的にフィルタリングされるため、パーツのマージ処理を待ったり FINAL キーワードを使用したりする必要はありません。データのクリーンアップはバックグラウンドで非同期的に行われます。
たとえば、次のクエリは、Title 列に hello という文字列が含まれている hits テーブルのすべての行を削除します。
軽量削除についての注意点:
- この機能は
MergeTreeテーブルエンジンファミリーでのみ利用できます。 - 軽量削除はデフォルトで同期的に実行され、すべてのレプリカが削除処理を完了するまで待機します。この動作は
lightweight_deletes_sync設定 によって制御されます。