Que se passe-t-il lorsque nous ajoutons un index à une table existante avec une grande quantité de données?

11

J'ai une table qui contiendra environ 15 millions d'enregistrements. Maintenant, je dois ajouter un index à la table.

L'ajout d'un index prendra un certain temps pour mettre à jour chaque entrée de la table.

Je suis assez confus si l'ajout de l'index entraînera des temps d'arrêt.

Si oui, comment puis-je surmonter les temps d'arrêt?

Harry Suren
la source
2
Voir Building Indexes Concurrently
ypercubeᵀᴹ

Réponses:

10

Avec plain CREATE INDEX, la table sera verrouillée pour les écritures mais pas pour les lectures.

Utilisez également CREATE INDEX CONCURRENTLYpour éviter les verrous en écriture.

Depuis les documents PostgreSQL surCREATE INDEX :

Lorsque cette option est utilisée, PostgreSQL construira l'index sans prendre de verrous empêchant les insertions, mises à jour ou suppressions simultanées sur la table; tandis qu'une construction d'index standard verrouille les écritures (mais pas les lectures) sur la table jusqu'à ce qu'elle soit terminée. Il y a plusieurs mises en garde à prendre en compte lors de l'utilisation de cette option - voir Création simultanée d'index .

Et plus précisément (comme @ypercube a commenté ):

PostgreSQL prend en charge la construction d'index sans verrouiller les écritures . Cette méthode est invoquée en spécifiant l' CONCURRENTLYoption de CREATE INDEX. Lorsque cette option est utilisée, PostgreSQL doit effectuer deux analyses de la table et, en outre, elle doit attendre la fin de toutes les transactions existantes qui pourraient potentiellement utiliser l'index. Ainsi, cette méthode nécessite plus de travail total qu'une génération d'index standard et prend beaucoup plus de temps à terminer. Cependant, étant donné qu'elle permet aux opérations normales de continuer pendant la génération de l'index, cette méthode est utile pour ajouter de nouveaux index dans un environnement de production.

Accentuation sur moi.

Fabrizio Mazzoni
la source