CREATE INDEX¶
Crée un nouvel index secondaire dans une table hybride existante et remplit l’index avec des données.
La création d’un index est une opération en ligne (non bloquante). La table hybride restera disponible pour les instructions SELECT et DML pendant la construction de l’index. Cependant, si la table hybride n’est pas utilisée activement et que le temps d’arrêt n’est pas un problème, il est recommandé de recréer la table hybride avec les index définis. Voir aussi Créer une table hybride.
- Voir aussi :
DROP INDEX , SHOW INDEXES , CREATE HYBRID TABLE , DROP TABLE , DESCRIBE TABLE , SHOW HYBRID TABLES
Syntaxe¶
CREATE [ OR REPLACE ] INDEX [ IF NOT EXISTS ] <index_name>
ON <table_name>
( <col_name> [ , <col_name> , ... ] )
Paramètres¶
index_name
Spécifie l’identificateur du nouvel index. Vous devez choisir un nom unique pour chaque nouvel index d’une table hybride donnée. Aucun autre index secondaire portant le même nom ou sur le même ensemble ordonné de colonnes ne peut exister sur la table hybride.
table_name
Spécifie le nom d’une table hybride existante qui contiendra le nouvel index.
col_name
Spécifie le nom d’une colonne existante dans la table hybride. Toutes les exigences relatives aux colonnes d’index définies lors de la création de la table s’appliquent aux identificateurs de colonnes.
Une table hybride ne peut pas contenir deux index secondaires définis sur le même ensemble ordonné de colonnes.
Les colonnes avec des types de données géospatiales (GEOGRAPHY et GEOMETRY), des types de données semi-structurées (ARRAY, OBJECT, VARIANT) et des types de données vectorielles (VECTOR) ne sont pas prises en charge dans les index secondaires.
Exigences en matière de contrôle d’accès¶
Pour créer un index, vous devez utiliser un rôle qui dispose du privilège OWNERSHIP sur la table hybride.
Notes sur l’utilisation¶
La commande CREATE INDEX ne peut pas être utilisée pour ajouter une contrainte de clé étrangère, primaire ou unique.
La création d’un nouvel index ne bloque pas simultanément d’autres charges de travail. La table hybride est disponible pour les instructions SELECT et DML simultanées.
Une seule opération active de construction d’index par table hybride peut être exécutée à tout moment.
Vous pouvez suivre la progression de la création d’un index en utilisant SHOW INDEXES. La colonne STATUS peut prendre les valeurs suivantes :
ACTIVE
: l’index est complet et peut être utilisé pour récupérer les données.SUSPENDED
: l’index est uniquement mis à jour et n’est pas utilisé pour récupérer des données.BUILD FAILURE
: une erreur s’est produite dans le processus de création de l’index. Vous devez supprimer et recréer l’index.BUILD IN PROGRESS
: l’index est en cours de création et n’est pas utilisé pour récupérer les données.
Vous pouvez reconstruire un index non actif, dont le statut est
SUSPENDED
,BUILD FAILURE
ouBUILD IN PROGRESS
, en utilisant DROP INDEX et CREATE INDEX.Si vous souhaitez supprimer une colonne qui fait partie d’un index en cours de création, vous devez d’abord arrêter la construction de l’index en supprimant l’index, puis la colonne. Si vous essayez de supprimer la colonne avant de supprimer l’index, vous recevrez le message d’erreur suivant :
Column '<col_name>' cannot be dropped because it is used by index '<index-name>'.
La construction de l’index en ligne ne progressera pas tant que toutes les transactions actives avec des DMLs sur la même table au moment où l’instruction CREATE INDEX a été émise ne seront pas terminées. Si l’une de ces transactions reste inactive pendant plus de 5 minutes, elle sera interrompue par défaut. Voir Transactions.
Pendant le processus de construction de l’index, tout DML effectue ses écritures dans le nouvel index, mais n’utilise pas l’index pour récupérer des données.
Un petit nombre de concurrents DMLs, qui a commencé à être exécuté après la fin de la commande CREATE INDEX, peut échouer et renvoyer cette erreur :
DML was unaware of concurrent DDL. Please retry this query.
Si les instructions DML interrompues font partie d’une transaction à plusieurs instructions, la transaction ne sera annulée que si le paramètre TRANSACTION_ABORT_ON_ERROR est défini sur TRUE.
Un index nouvellement créé ne sera utilisé pour récupérer des données que lorsque le processus de création de l’index se terminera correctement et que le statut de l’index sera
ACTIVE
.
Exemples¶
Pour exécuter l’exemple CREATE INDEX suivant, créez et chargez d’abord la table hybride.
CREATE OR REPLACE HYBRID TABLE mytable (
pk INT PRIMARY KEY,
val INT,
val2 INT
);
INSERT INTO mytable SELECT seq, seq+100, seq+200
FROM (SELECT seq8() seq FROM TABLE(GENERATOR(rowcount => 100)) v);
Vous pouvez maintenant créer un index sur la table :
CREATE OR REPLACE INDEX vidx ON mytable (val);
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
Si une défaillance survient pendant la construction de l’index, la commande SHOW INDEXES signale le statut suivant :
BUILD FAILURE Index build failed. Please drop the index and re-create it.
Si vous décidez d’arrêter la construction de l’index, vous pouvez utiliser la commande DROP INDEX :
DROP INDEX mytable.vidx;
+-------------------------------------+
| status |
|-------------------------------------|
| Statement executed successfully. |
+-------------------------------------+