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

OPTIMIZE ステートメント

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

注記

OPTIMIZEToo many parts エラーを修正することはできません。

構文

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句が指定されていない場合)は重複が排除されます(すべてのカラムが比較されます)。これは MergeTree エンジンに対してのみ意味があります。

非アクティブなレプリカが OPTIMIZE クエリを実行するのを待つ時間(秒)を指定するには、replication_wait_for_inactive_replica_timeout 設定を使用してください。

注記

alter_sync2 に設定されていて、いくつかのレプリカが replication_wait_for_inactive_replica_timeout 設定によって指定された時間を超えてアクティブでない場合、例外 UNFINISHED がスローされます。

BY 式

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

注記

*SELECT と同様に動作します: MATERIALIZEDALIAS のカラムは展開に使用されません。

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

構文

テーブルを考えてみましょう:

結果:

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

DEDUPLICATE

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

結果:

DEDUPLICATE BY *

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

結果:

DEDUPLICATE BY * EXCEPT

重複排除は、ALIAS または MATERIALIZED ではなく、明示的に value を除外したすべてのカラム(primary_keysecondary_keypartition_key カラム)で行われます。

結果:

DEDUPLICATE BY <list of columns>

primary_keysecondary_key、および partition_key カラムで明示的に重複排除します:

結果:

DEDUPLICATE BY COLUMNS(<regex>)

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

結果: