ADD INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] ADD INDEX [IF NOT EXISTS] name expression TYPE type [GRANULARITY value] [FIRST|AFTER name] - Ajoute la description d’un index aux métadonnées des tables.
DROP INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] DROP INDEX [IF EXISTS] name - Supprime la description de l’index des métadonnées de la table et supprime les fichiers d’index du disque. Implémenté sous la forme d’une mutation.
MATERIALIZE INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] MATERIALIZE INDEX [IF EXISTS] name [IN PARTITION partition_name] - Reconstruit l’index secondaire name pour le partition_name indiqué. Cette opération est implémentée sous forme de mutation. Si la clause IN PARTITION est omise, l’index est reconstruit pour l’ensemble des données de la table.
MATERIALIZE COLUMN ne remplace pas entièrement MATERIALIZE INDEX. Sur les parties à la fois wide + full-storage, cette commande peut réécrire les valeurs de colonnes sans actualiser les fichiers autonomes des index de saut (ou des index de texte). Les index de saut classiques stockés dans skp_idx.packed font exception : ils peuvent tout de même être recalculés de force sur les parties wide + full-storage (pour les petits sous-flux d’index de saut inférieurs à la valeur par défaut de packed_skip_index_max_bytes ; les index de texte intégral ne sont pas empaquetés de cette manière). Sur toute partie autre que wide + full-storage (notamment compact + full, compact + packed et wide + packed), une réécriture complète de la partie peut recalculer les index existants — les petites parties sont généralement compactes tout en utilisant, par défaut, le stockage de partie full. Utilisez MATERIALIZE INDEX pour une approche déterministe et immédiate lorsqu’un index a été ajouté à une table contenant déjà des données (ADD INDEX uniquement dans les métadonnées), ainsi qu’après des réécritures de colonnes sur des parties wide+full-storage lorsque vous devez reconstruire immédiatement les fichiers d’index autonomes. Les index nouvellement ajoutés (y compris les index de texte) sur des parties historiques peuvent également être matérialisés lors d’une fusion ultérieure si materialize_skip_indexes_on_merge est activé et que l’index n’est pas exclu via exclude_materialize_skip_indexes_on_merge ; sinon, ils restent non matérialisés jusqu’à l’exécution explicite de MATERIALIZE INDEX.
CLEAR INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] CLEAR INDEX [IF EXISTS] name [IN PARTITION partition_name] - Supprime les fichiers d’index secondaires du disque sans en supprimer la définition. Implémenté sous forme de mutation.
Les commandes ADD, DROP et CLEAR sont légères, au sens où elles ne modifient que les métadonnées ou suppriment des fichiers.
De plus, elles sont répliquées, les métadonnées des index étant synchronisées via ClickHouse Keeper ou ZooKeeper.
La manipulation des index n’est prise en charge que pour les tables utilisant le moteur
*MergeTree (y compris les variantes répliquées).ALTER simultanés et MATERIALIZE INDEX à plusieurs clauses
ALTER distincts exécutés rapidement sur une même table peuvent déclencher CANNOT_ASSIGN_ALTER (code 517) lorsque les ALTER précédents n’ont pas encore été appliqués sur la réplique (les métadonnées sont encore en retard — cela peut rester le cas après qu’un ALTER antérieur a déjà été affecté). Il s’agit d’une condition générale liée à des ALTER simultanés sur les métadonnées ou à des mutations (et pas uniquement aux mutations) ; sérialisez les opérations ou réessayez, attendez les ALTER antérieurs générant des mutations via mutations_sync / is_done dans system.mutations, ou combinez des opérations de métadonnées indépendantes dans un seul ALTER à plusieurs clauses lorsque la grammaire le permet. Consultez Synchronicité des requêtes ALTER et Attribution simultanée d’ALTER.
Plusieurs clauses MATERIALIZE INDEX peuvent figurer dans un même ALTER. Le cas couvert dans l’arbre source consiste à regrouper plusieurs clauses ADD INDEX et MATERIALIZE INDEX pour ces mêmes nouveaux index dans une seule instruction (tests/queries/0_stateless/02911_add_index_and_materialize_index.sql). Cette forme groupée est destinée aux bases de données ordinaires (non-DatabaseReplicated) — DatabaseReplicated rejette les segments mixtes ADD INDEX + MATERIALIZE INDEX avec QUERY_IS_PROHIBITED. Les formes à plusieurs clauses contenant uniquement MATERIALIZE INDEX sur des index existants suivent le même chemin de préparation de l’instantané des métadonnées dans l’implémentation actuelle, mais cette forme précise n’est pas encore couverte par un test stateless ciblé ; considérez-la comme un comportement de l’implémentation actuelle plutôt que comme un contrat garanti distinctement, jusqu’à ce qu’une telle couverture existe. Pour une application ordonnée, exécutez un MATERIALIZE INDEX par instruction et attendez avec mutations_sync.