ClickHouse/docs/ja/guides/developer/mutations.md
2024-11-18 11:58:58 +09:00

4.7 KiB
Raw Blame History

slug sidebar_label sidebar_position keywords
/ja/guides/developer/mutations データの更新と削除 1
更新
削除
ミューテーション

ClickHouse データの更新と削除

ClickHouse は高ボリュームの分析ワークロードに適しているものの、特定の状況では既存のデータを変更または削除できます。これらの操作は「ミューテーション」と呼ばれ、ALTER TABLE コマンドを使用して実行されます。また、ClickHouse の論理削除の機能を使用して、行を DELETE することもできます。

:::tip 頻繁な更新が必要な場合は、ClickHouse の 重複排除 を使用することを検討してください。これにより、ミューテーションイベントを生成せずに行を更新および/または削除できます。 :::

データの更新

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

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

<expression><filter_expr> を満たすカラムの新しい値です。<expression> はカラムと同じデータ型であるか、CAST 演算子を使用して同じデータ型に変換可能である必要があります。<filter_expr> はデータの各行に対して UInt80 または 0 以外)の値を返す必要があります。複数の UPDATE <column> ステートメントをカンマで区切って単一の ALTER TABLE コマンドに組み合わせることができます。

:

  1. このようなミューテーションは、Dictionaryルックアップを使用して visitor_id を新しいものに更新できます。

    ALTER TABLE website.clicks
    UPDATE visitor_id = getDict('visitors', 'new_visitor_id', visitor_id)
    WHERE visit_date < '2022-01-01'
    
  2. 一つのコマンドで複数の値を変更することで、複数のコマンドよりも効率的になります。

    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%'
    

:::note 主キーまたはソートキーの一部であるカラムを更新することはできません。 :::

データの削除

行を削除するには、ALTER TABLE コマンドを使用します:

ALTER TABLE [<database>.]<table> DELETE WHERE <filter_expr>

<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 < '2022-01-02 15:00:00' AND page_id = '573'
    

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

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

論理削除

行を削除する別のオプションとして、DELETE FROM コマンドがあります。これは 論理削除 と呼ばれます。削除された行は即座に削除としてマークされ、後続のすべてのクエリから自動的にフィルタリングされるため、パーツのマージを待ったり FINAL キーワードを使用したりする必要はありません。データのクリーンアップはバックグラウンドで非同期に行われます。

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

たとえば、次のクエリは、Title カラムに hello というテキストが含まれる hits テーブルのすべての行を削除します。

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

論理削除に関する注意事項:

  • この機能は MergeTree テーブルエンジンファミリーでのみ利用可能です。
  • 論理削除はデフォルトで非同期です。mutations_sync を 1 に設定すると 1 つのレプリカがステートメントを処理するのを待ち、2 に設定するとすべてのレプリカを待ちます。