メインコンテンツへスキップ
メインコンテンツへスキップ

ミューテーションを使用した ClickHouse データの更新と削除

ClickHouse は大規模な分析ワークロード向けに最適化されていますが、状況によっては既存データを変更したり 削除したりすることも可能です。これらの操作は「ミューテーション (mutation)」と呼ばれ、ALTER TABLE コマンドを使って実行されます。

ヒント

頻繁に更新を行う必要がある場合は、ClickHouse の deduplication の利用を検討してください。これを利用すると、 ミューテーションイベントを発生させることなく行の更新および/または削除が可能です。あるいは、lightweight updateslightweight deletes を使用してください。

データの更新

テーブル内の行を更新するには、ALTER TABLE...UPDATE コマンドを使用します。

ALTER TABLE [<database>.]<table> UPDATE <column> = <expression> WHERE <filter_expr>

<expression> は、<filter_expr> の条件を満たす行に対してその列に設定される新しい値です。<expression> は、その列と同じデータ型であるか、CAST 演算子を使用して同じデータ型に変換可能である必要があります。<filter_expr> は、データの各行に対して UInt8(ゼロまたは非ゼロ)の値を返す必要があります。複数の UPDATE <column> ステートメントは、カンマで区切って 1 つの ALTER TABLE コマンドにまとめることができます。

:

  1. 次のようなミューテーションにより、ディクショナリルックアップを使って visitor_ids を新しいものに更新できます。

    ALTER TABLE website.clicks
    UPDATE visitor_id = getDict('visitors', 'new_visitor_id', visitor_id)
    WHERE visit_date < '2022-01-01'
    
  2. 1 回のコマンドで複数の値を変更する方が、複数回のコマンド実行より効率的な場合があります。

    ALTER TABLE website.clicks
    UPDATE url = substring(url, position(url, '://') + 3), visitor_id = new_visit_id
    WHERE visit_date < '2022-01-01'
    
  3. シャーディングされたテーブルに対しては、ミューテーションを ON CLUSTER で実行できます。

    ALTER TABLE clicks ON CLUSTER main_cluster
    UPDATE click_count = click_count / 2
    WHERE visitor_id ILIKE '%robot%'
    
注記

主キーまたはソートキーの一部になっている列を更新することはできません。

データの削除

ALTER TABLE コマンドを使用して行を削除します。

ALTER TABLE [<データベース>.]<テーブル> DELETE WHERE <フィルタ式>

<filter_expr> は、各行のデータに対して UInt8 型の値を返す必要があります。

  1. 列が特定の値の配列に含まれている行を削除する:

    ALTER TABLE website.clicks DELETE WHERE visitor_id IN (253, 1002, 4277)
    
  2. このクエリでどのデータが削除されるか:

    ALTER TABLE clicks ON CLUSTER main_cluster DELETE WHERE visit_date &lt; '2022-01-02 15:00:00' AND page_id = '573'
    
注記

テーブル内のすべてのデータを削除するには、TRUNCATE TABLE [<database].]<table> コマンドを使用する方が効率的です。このコマンドは ON CLUSTER とともに実行することもできます。

詳細については、DELETE ステートメント のドキュメントページを参照してください。

軽量削除

行を削除するもう 1 つの方法は、軽量削除 と呼ばれる DELETE FROM 文を使用することです。削除された行には即座に削除フラグが付き、その後のすべてのクエリから自動的にフィルタリングされるため、パーツのマージ処理を待ったり FINAL キーワードを使用したりする必要はありません。データのクリーンアップはバックグラウンドで非同期的に行われます。

DELETE FROM [db.]table [ON CLUSTER cluster] [WHERE expr]

たとえば、次のクエリは、Title 列に hello という文字列が含まれている hits テーブルのすべての行を削除します。

DELETE FROM hits WHERE Title LIKE '%hello%';

軽量削除についての注意点:

  • この機能は MergeTree テーブルエンジンファミリーでのみ利用できます。
  • 軽量削除はデフォルトで同期的に実行され、すべてのレプリカが削除処理を完了するまで待機します。この動作は lightweight_deletes_sync 設定 によって制御されます。