OPTIMIZE ステートメント
このクエリは、テーブルのデータパーツのスケジュールされていないマージを初期化しようとします。一般的に OPTIMIZE TABLE ... FINAL
の使用はおすすめしません(管理目的での使用が想定されているため、日常的な操作には向いていません。詳しくはこれらの ドキュメント を参照してください)。
OPTIMIZE
は Too many parts
エラーを修正することはできません。
構文
OPTIMIZE
クエリは、MergeTree ファミリー(マテリアライズドビューを含む)および Buffer エンジンでサポートされています。他のテーブルエンジンはサポートされていません。
OPTIMIZE
が ReplicatedMergeTree ファミリーのテーブルエンジンと共に使用されると、ClickHouse はマージのタスクを作成し、すべてのレプリカで実行を待機します(alter_sync 設定が 2
に設定されている場合)または現在のレプリカで実行を待機します(alter_sync 設定が 1
に設定されている場合)。
- 理由により
OPTIMIZE
がマージを実行しない場合、クライアントに通知されません。通知を有効にするには、optimize_throw_if_noop 設定を使用してください。 PARTITION
を指定すると、指定されたパーティションのみが最適化されます。パーティション式の設定方法を参照してください。FINAL
またはFORCE
を指定すると、すべてのデータがすでに1つのパーツにある場合でも最適化が実行されます。この動作は optimize_skip_merged_partitions によって制御できます。また、同時にマージが実行されていても強制的にマージされます。DEDUPLICATE
を指定すると、完全に同一の行(by句が指定されていない場合)は重複が排除されます(すべてのカラムが比較されます)。これは MergeTree エンジンに対してのみ意味があります。
非アクティブなレプリカが OPTIMIZE
クエリを実行するのを待つ時間(秒)を指定するには、replication_wait_for_inactive_replica_timeout 設定を使用してください。
alter_sync
が 2
に設定されていて、いくつかのレプリカが replication_wait_for_inactive_replica_timeout
設定によって指定された時間を超えてアクティブでない場合、例外 UNFINISHED
がスローされます。
BY 式
重複排除をすべてのカラムではなく、カスタムのカラムセットに対して実行したい場合は、カラムのリストを明示的に指定するか、*
、COLUMNS
または EXCEPT
式の組み合わせを使用できます。明示的に書かれたカラムのリストまたは暗黙の拡張リストは、行順序式(主キーおよびソートキーの両方)とパーティション式(パーティションキー)で指定されたすべてのカラムを含める必要があります。
*
は SELECT
と同様に動作します: MATERIALIZED と ALIAS のカラムは展開に使用されません。
また、空のカラムリストを指定したり、空のカラムリストを生成する式を書いたり、ALIAS
カラムで重複排除をすることはエラーです。
構文
例
テーブルを考えてみましょう:
結果:
以下の例はすべて5行の状態に対して実行されます。
DEDUPLICATE
重複排除のカラムが指定されていない場合は、すべてのカラムが考慮されます。行は、すべてのカラムの値が前の行の対応する値と等しい場合にのみ削除されます:
結果:
DEDUPLICATE BY *
カラムが暗黙的に指定された場合、テーブルは ALIAS
または MATERIALIZED
ではないすべてのカラムで重複排除されます。上記のテーブルを考慮すると、これらは primary_key
、secondary_key
、value
、および partition_key
カラムです:
結果:
DEDUPLICATE BY * EXCEPT
重複排除は、ALIAS
または MATERIALIZED
ではなく、明示的に value
を除外したすべてのカラム(primary_key
、secondary_key
、partition_key
カラム)で行われます。
結果:
DEDUPLICATE BY <list of columns>
primary_key
、secondary_key
、および partition_key
カラムで明示的に重複排除します:
結果:
DEDUPLICATE BY COLUMNS(<regex>)
正規表現に一致するすべてのカラムで重複排除を実行します:primary_key
、secondary_key
、および partition_key
カラム:
結果: