web-dev-qa-db-fra.com

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

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 du 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, alors comment puis-je surmonter le temps d'arrêt?

11
Harry Suren

Avec de la nature CREATE INDEX, la table sera verrouillée pour écrit mais ne se lit pas.

Utilisation CREATE INDEX CONCURRENTLY Pour éviter d'écrire des serrures.

Du Docs PostgreSQL sur CREATE INDEX :

Lorsque cette option est utilisée, PostgreSQL construira l'index sans prendre de verrous empêchant les inserts, les mises à jour ou les suppresses simultanées sur la table; ATTENDU QU'une construction d'indice standard verrouille des écritures (mais pas lit) sur la table jusqu'à ce qu'elle soit faite. Il existe plusieurs mises en garde à prendre conscience de l'utilisation de cette option - voir Index de construction simultanément .

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

PostgreSQL prend en charge les index de construction Sans verrouillage des écritures. Cette méthode est invoquée en spécifiant l'option CONCURRENTLY de CREATE INDEX. Lorsque cette option est utilisée, PostgreSQL doit effectuer deux analyses de la table et, en outre, il doit attendre toutes les transactions existantes pouvant potentiellement utiliser l'index pour terminer. Ainsi, cette méthode nécessite plus de travail total que la construction d'index standard et prend beaucoup plus de temps à compléter. Cependant, puisqu'il permet aux opérations normales de continuer lorsque l'index est construit, cette méthode est utile pour ajouter de nouveaux index dans un environnement de production.

Mine d'accompagnement audacieux.

10
Fabrizio Mazzoni