Création d'index concurrente dans Firebird 5
Actuellement, lors de la construction d’un index, toute modification des données de la table est interdite. Cela est nécessaire pour créer un index correct, sans manquer les nouvelles clés insérées pendant la construction.
L’algorithme de construction d’index concurrent permet de réduire considérablement la durée pendant laquelle ce verrou de lecture est requis. Bien qu’il n’élimine pas totalement la nécessité de bloquer les modifications concurrentes des données de la table, la durée de ce blocage est bien moindre par rapport à l’algorithme traditionnel non concurrent. Cela est particulièrement utile en environnement de production, où le blocage de l’activité des utilisateurs pendant de longues périodes est impractical ou impossible.
En raison de la charge concurrente et de la complexité supplémentaire, la création d’index concurrent peut prendre plus de temps que l’approche traditionnelle.
Syntaxe
Le nouveau mot-clé optionnel non réservé CONCURRENTLY est utilisé pour spécifier la création d’index concurrent.
Créer un nouvel index
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX indexname ON tablename {(col [, col ...]) | COMPUTED BY ()} [WHERE ] [CONCURRENTLY]
Activer un index existant
ALTER INDEX indexname {ACTIVE | INACTIVE} [CONCURRENTLY]
Notez que CONCURRENTLY ne peut être utilisé qu’avec ACTIVE.
Validation de l’unicité
Il est difficile, voire impossible, de vérifier l’unicité d’un index pendant sa construction concurrente. Par conséquent, lorsqu’un index unique est créé (ou activé) de manière concurrente, il est immédiatement marqué comme NOT VALIDATED dans le catalogue système. L’unicité de l’index est validée après la fin de la construction de l’index, lorsque l’index contient les clés de tous les enregistrements de la table.
Si la vérification de l’unicité réussit, la marque NOT VALIDATED est effacée.
Si la vérification de l’unicité échoue, l’index reste actif et est marqué comme NOT VALIDATED. Par la suite, l’utilisateur peut trouver et corriger les doublons, puis valider à nouveau l’unicité, ou supprimer l’index si cela est approprié.
Notez qu’un index unique NOT VALIDATED n’autorise toujours pas l’insertion de doublons dans la table.
Pour valider un index unique, exécutez
ALTER INDEX indexname VALIDATE UNIQUE
Cette instruction effectue une analyse de l’index pour trouver les clés en double et vérifier les enregistrements correspondants. Si aucun doublon n’est trouvé, la marque NOT VALIDATED est effacée et l’index est considéré comme validé. Sinon, la marque NOT VALIDATED reste en place et l’index peut être validé à nouveau plus tard.
La commande isql SHOW INDEX affiche désormais la marque NOT VALIDATED, si elle est présente.
Contraintes de table
La création concurrente d’index pour les contraintes de table, telles que PRIMARY|UNIQUE|FOREIGN KEY, n’est pas encore prise en charge. Il est possible de prendre en charge PRIMARY|UNIQUE KEY à l’avenir, mais cela est peu probable pour FOREIGN KEY.
Exemples
Préparez une table avec quelques données
create table tab ( id int not null, f1 varchar(64));
insert into tab values (1, '1');
insert into tab values (1, '2');commit;
créez un index en utilisant la clause CONCURRENTLY
create index idx_tab_f1 on tab(f1) concurrently;
créez un index unique sur une colonne contenant des doublons
create unique index idx_tab_id on tab(id);
cela génère une erreur :
Statement failed, SQLSTATE = 23000
attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)
créez le même index unique en utilisant CONCURRENTLY
create unique index idx_tab_id on tab(id) concurrently;
cela génère un avertissement :
Validation of unique index "IDX_TAB_ID" failed.
-attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)
vérifiez si l’index existe :
show index idx_tab_id;
IDX_TAB_ID UNIQUE NOT VALIDATED INDEX ON (ID)
notez la marque NOT VALIDATED.
Validez l’index :
alter index idx_tab_id validate unique;
Statement failed, SQLSTATE = 23000
unsuccessful metadata update-Validation of unique index "IDX_TAB_ID" failed.
-attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)
Corrigez l’enregistrement en double et validez à nouveau
update tab set id = 2 where f1 = '2';
commit;
alter index idx_tab_id validate unique;
aucune erreur.
Vérifiez l’état de l’index :
show index idx_tab_id;
IDX_TAB_ID UNIQUE INDEX ON (ID)
Téléchargez HQbird et essayez-le dès maintenant : /fr/download-hqbird