メインコンテンツまでスキップ
メインコンテンツまでスキップ

OPTIMIZE Statement

このクエリは、テーブルのデータパーツのスケジュールされていないマージを初期化しようとします。一般的には、OPTIMIZE TABLE ... FINAL の使用はお勧めしません(詳細はこちらのドキュメントを参照); このコマンドの使用ケースは管理のためのものであり、日常の操作向けではありません。

注記

OPTIMIZEToo many parts エラーを修正できません。

構文

OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition | PARTITION ID 'partition_id'] [FINAL | FORCE] [DEDUPLICATE [BY expression]]

OPTIMIZE クエリは MergeTree ファミリー(マテリアライズドビューを含む)および Buffer エンジンでサポートされています。他のテーブルエンジンはサポートされていません。

OPTIMIZEReplicatedMergeTree ファミリーのテーブルエンジンとともに使用される場合、ClickHouseはマージのタスクを作成し、すべてのレプリカでの実行を待機します(alter_sync の設定が 2 に設定されている場合)または現在のレプリカで(alter_sync の設定が 1 に設定されている場合)。

  • OPTIMIZE が何らかの理由でマージを実行しない場合、クライアントには通知されません。通知を有効にするには、optimize_throw_if_noop 設定を使用します。
  • PARTITION を指定した場合、指定したパーティションのみが最適化されます。パーティション式の設定方法を参照してください。
  • FINAL または FORCE を指定すると、すべてのデータがすでに1つのパーツに存在する場合でも最適化が実行されます。この動作は、optimize_skip_merged_partitions で制御できます。また、同時にマージが実行されている場合でも強制的にマージされます。
  • DEDUPLICATE を指定すると、完全に同一の行(by-clause が指定されていない限り)が重複削除されます(すべてのカラムが比較されます)。これは、MergeTreeエンジンに対してのみ意味があります。

非アクティブなレプリカが OPTIMIZE クエリを実行するのを待つ秒数を、replication_wait_for_inactive_replica_timeout 設定で指定できます。

注記

alter_sync2 に設定されている場合で、いくつかのレプリカが replication_wait_for_inactive_replica_timeout 設定で指定された時間よりも長く非アクティブのままだと、例外 UNFINISHED がスローされます。

BY expression

すべてのカラムではなく、カスタムで指定したカラムに対して重複削除を行いたい場合、カラムのリストを明示的に指定するか、*COLUMNS、または EXCEPT 式の任意の組み合わせを使用できます。明示的に記述されたリストまたは暗黙的に拡張されたカラムのリストは、行の順序付け式(主キーおよびソートキーの両方)とパーティション式(パーティションキー)で指定されたすべてのカラムを含む必要があります。

注記

*SELECT と同じように動作することに注意してください: MATERIALIZED および ALIAS カラムは展開に使用されません。

また、空のカラムリストを指定したり、空のカラムリストを生成する式を書いたり、ALIAS カラムによって重複削除を行うことはエラーです。

構文

OPTIMIZE TABLE table DEDUPLICATE; -- すべてのカラム
OPTIMIZE TABLE table DEDUPLICATE BY *; -- MATERIALIZED および ALIAS カラムを除外
OPTIMIZE TABLE table DEDUPLICATE BY colX,colY,colZ;
OPTIMIZE TABLE table DEDUPLICATE BY * EXCEPT colX;
OPTIMIZE TABLE table DEDUPLICATE BY * EXCEPT (colX, colY);
OPTIMIZE TABLE table DEDUPLICATE BY COLUMNS('column-matched-by-regex');
OPTIMIZE TABLE table DEDUPLICATE BY COLUMNS('column-matched-by-regex') EXCEPT colX;
OPTIMIZE TABLE table DEDUPLICATE BY COLUMNS('column-matched-by-regex') EXCEPT (colX, colY);

次のテーブルを考慮してください:

CREATE TABLE example (
    primary_key Int32,
    secondary_key Int32,
    value UInt32,
    partition_key UInt32,
    materialized_value UInt32 MATERIALIZED 12345,
    aliased_value UInt32 ALIAS 2,
    PRIMARY KEY primary_key
) ENGINE=MergeTree
PARTITION BY partition_key
ORDER BY (primary_key, secondary_key);
INSERT INTO example (primary_key, secondary_key, value, partition_key)
VALUES (0, 0, 0, 0), (0, 0, 0, 0), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 3);
SELECT * FROM example;

結果:


┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           0 │             0 │     0 │             0 │
│           0 │             0 │     0 │             0 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           1 │             1 │     2 │             2 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           1 │             1 │     2 │             3 │
│           1 │             1 │     3 │             3 │
└─────────────┴───────────────┴───────┴───────────────┘

以下のすべての例は、5行のこの状態に対して実行されます。

DEDUPLICATE

重複削除するカラムが指定されていない場合は、すべてのカラムが考慮されます。行が削除されるのは、すべてのカラムの値が前の行の対応する値と等しい場合のみです:

OPTIMIZE TABLE example FINAL DEDUPLICATE;
SELECT * FROM example;

結果:

┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           1 │             1 │     2 │             2 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           0 │             0 │     0 │             0 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           1 │             1 │     2 │             3 │
│           1 │             1 │     3 │             3 │
└─────────────┴───────────────┴───────┴───────────────┘

DEDUPLICATE BY *

カラムが暗黙的に指定された場合、テーブルは ALIAS または MATERIALIZED でないすべてのカラムで重複削除されます。上記のテーブルを考えると、これに該当するのは primary_keysecondary_keyvalue、および partition_key カラムです:

OPTIMIZE TABLE example FINAL DEDUPLICATE BY *;
SELECT * FROM example;

結果:

┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           1 │             1 │     2 │             2 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           0 │             0 │     0 │             0 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           1 │             1 │     2 │             3 │
│           1 │             1 │     3 │             3 │
└─────────────┴───────────────┴───────┴───────────────┘

DEDUPLICATE BY * EXCEPT

ALIAS または MATERIALIZED でないすべてのカラムを重複削除し、明示的に value を除外します: primary_keysecondary_key、および partition_key カラムです。

OPTIMIZE TABLE example FINAL DEDUPLICATE BY * EXCEPT value;
SELECT * FROM example;

結果:

┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           1 │             1 │     2 │             2 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           0 │             0 │     0 │             0 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           1 │             1 │     2 │             3 │
└─────────────┴───────────────┴───────┴───────────────┘

DEDUPLICATE BY <list of columns>

明示的に primary_keysecondary_key、および partition_key カラムで重複削除を行います:

OPTIMIZE TABLE example FINAL DEDUPLICATE BY primary_key, secondary_key, partition_key;
SELECT * FROM example;

結果:

┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           1 │             1 │     2 │             2 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           0 │             0 │     0 │             0 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           1 │             1 │     2 │             3 │
└─────────────┴───────────────┴───────┴───────────────┘

DEDUPLICATE BY COLUMNS(<regex>)

正規表現に一致するすべてのカラムで重複削除を行います: primary_keysecondary_key、および partition_key カラムです:

OPTIMIZE TABLE example FINAL DEDUPLICATE BY COLUMNS('.*_key');
SELECT * FROM example;

結果:

┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           0 │             0 │     0 │             0 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           1 │             1 │     2 │             2 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│           1 │             1 │     2 │             3 │
└─────────────┴───────────────┴───────┴───────────────┘