web-dev-qa-db-fra.com

postgres; les index réindexent-ils automatiquement les nouvelles données?

Si j'ai un tas de lignes dans une table Postgres, puis que je crée un index, l'index est-il automatiquement mis à jour si de nouvelles lignes de données sont insérées après sa création?

Autrement dit, REINDEX n'est-il nécessaire que dans certains scénarios plus rares, ou chaque fois que de nouvelles données sont ajoutées?

7
Tommy

Les nouvelles données sont indexées automatiquement. Notez cependant que la présence d'un index ralentira donc inserts et updates (et deletes aussi bien sûr). Pour les tables avec un volume de transactions extrêmement élevé, vous devez être très prudent lors de l'ajout d'index. Pour les tables la plupart dans les systèmes la plupart, ce n'est pas un problème.

reindex est rarement nécessaire dans des circonstances normales. Parmi ces rares cas, le plus courant est probablement le "ballonnement" causé par de nombreuses mutations - généralement lorsque ces mutations entraînent la suppression des données sur le disque du "milieu" et leur ajout à la "fin".

4
Colin 't Hart

Permettez-moi de citer documentation :

REINDEX reconstruit un index à l'aide des données stockées dans la table de l'index, en remplaçant l'ancienne copie de l'index. Il existe plusieurs scénarios dans lesquels utiliser REINDEX:

  • Un index est corrompu et ne contient plus de données valides. Bien qu'en théorie cela ne devrait jamais se produire, dans la pratique, les index peuvent être corrompus en raison de bogues logiciels ou de pannes matérielles. REINDEX fournit une méthode de récupération.

  • Un index est devenu "gonflé", c'est-à-dire qu'il contient de nombreuses pages vides ou presque vides. Cela peut se produire avec des index B-tree dans PostgreSQL sous certains modèles d'accès rares. REINDEX permet de réduire la consommation d'espace de l'index en écrivant une nouvelle version de l'index sans les pages mortes. Voir Section 24.2 pour plus d'informations.

  • Vous avez modifié un paramètre de stockage (tel que fillfactor) pour un index et souhaitez vous assurer que la modification a pris pleinement effet.

  • Une génération d'index avec l'option CONCURRENTLY a échoué, laissant un index "non valide". De tels index sont inutiles mais il peut être pratique d'utiliser REINDEX pour les reconstruire. Notez que REINDEX n'effectuera pas de génération simultanée. Pour créer l'index sans interférer avec la production, vous devez supprimer l'index et relancer la commande CREATE INDEX CONCURRENTLY.

Rien ne dit que REINDEX doit être appelé après des procédures de routine telles que les appels UPDATE ou INSERT.

Répondre à votre question "l'index est-il automatiquement mis à jour si de nouvelles lignes de données sont insérées après sa création". Oui, les index sont automatiquement reconstruits, sinon ils n'ont pas beaucoup de sens. La reconstruction des index dans OLTP fait partie d'une transaction, c'est pourquoi INSERT/UPDATE/DELETE peut prendre beaucoup de temps dans une table avec des index massifs - l'opération ne se terminera pas tant que les index ne seront pas reconstruits .

1
Ilya Konyukhov