ADD INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] ADD INDEX [IF NOT EXISTS] name expression TYPE type [GRANULARITY value] [FIRST|AFTER name] - テーブルのメタデータに索引の定義を追加します。
DROP INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] DROP INDEX [IF EXISTS] name - テーブルのメタデータから索引の定義を削除し、ディスク上の索引ファイルを削除します。mutation として実装されています。
MATERIALIZE INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] MATERIALIZE INDEX [IF EXISTS] name [IN PARTITION partition_name] - 指定した partition_name のセカンダリ索引 name を再構築します。mutation として実装されています。IN PARTITION 部分を省略した場合は、テーブル全体のデータに対して索引を再構築します。
MATERIALIZE COLUMN は、MATERIALIZE INDEX を完全に代替するものではありません。wide + full-storage のパーツでは、スタンドアロンのスキップ索引 (またはテキスト索引) ファイルを更新せずにカラム値を書き換える可能性があります。skp_idx.packed に格納される通常のスキップ索引は例外で、wide + full-storage パーツでも強制的に再計算できます (デフォルトの packed_skip_index_max_bytes 未満の小さなスキップ索引サブストリーム。全文索引はこの方法ではパックされません) 。wide + full-storage 以外のすべてのパーツ (compact + full、compact + packed、wide + packed を含む) では、パーツ全体を書き換えることで既存の索引を再計算できます。小さなパーツは、デフォルトで full パーツストレージを使用している場合でも、通常は compact です。既存データのあるテーブルに索引を追加した場合 (メタデータのみの ADD INDEX) や、wide+full-storage パーツでカラムを書き換えた後にスタンドアロン索引ファイルをすぐに再構築する必要がある場合は、決定論的かつ即時に処理できる MATERIALIZE INDEX を使用します。履歴パーツに新たに追加された索引 (テキスト索引を含む) も、materialize_skip_indexes_on_merge が有効で、かつ exclude_materialize_skip_indexes_on_merge によって索引が除外されていなければ、後続のマージでマテリアライズできます。それ以外の場合は、明示的に MATERIALIZE INDEX を実行するまでマテリアライズされません。
CLEAR INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] CLEAR INDEX [IF EXISTS] name [IN PARTITION partition_name] - 定義を削除せずに、ディスク上のセカンダリ索引ファイルを削除します。mutation として実装されています。
ADD、DROP、CLEAR コマンドは、メタデータを変更するかファイルを削除するだけであるという意味で軽量です。
また、これらはレプリケーションされ、ClickHouse Keeper または ZooKeeper を介して索引メタデータが同期されます。
索引の操作は、
*MergeTree エンジンのテーブル (replicated バリアントを含む) でのみサポートされます。同時実行 ALTER と複数句の MATERIALIZE INDEX
ALTER を短時間に連続して実行すると、先行する ALTER がまだレプリカに適用されていない場合に CANNOT_ASSIGN_ALTER (コード 517) が発生することがあります (メタデータの反映が遅れているためで、先行する alter がすでに割り当てられた後もこの状態が続くことがあります) 。これは mutation のみに限らない、同時実行されるメタデータ ALTER / mutation に関する一般的な状態です。直列化して再試行するか、mutations_sync / system.mutations の is_done を使用して、先行する mutation を生成する alter の完了を待ってください。また、文法上可能であれば、独立したメタデータ操作を複数句からなる 1 つの ALTER にまとめてください。ALTER クエリの同期性および同一テーブルにおける同時 ALTER の割り当てを参照してください。
複数の MATERIALIZE INDEX 句を 1 つの ALTER に含めることができます。ツリー内でカバーされているケースは、複数の ADD INDEX 句と、それらの新しい索引に対する MATERIALIZE INDEX を 1 つのステートメントにまとめるものです (tests/queries/0_stateless/02911_add_index_and_materialize_index.sql) 。この一括指定形式は通常の (非 DatabaseReplicated) データベース用です。DatabaseReplicated は、ADD INDEX と MATERIALIZE INDEX が混在するセグメントを QUERY_IS_PROHIBITED で拒否します。既存の索引に対する materialize のみの複数句形式も、現行実装では同じメタデータスナップショット準備パスをたどりますが、この正確な形式はまだ対象を絞った stateless テストでカバーされていません。そのようなテストでカバーされるまでは、個別に保証された仕様ではなく、現行実装の動作として扱ってください。順序どおりに適用するには、ステートメントごとに 1 つの MATERIALIZE INDEX を実行し、mutations_sync で完了を待ってください。