Un REINDEX est-il nécessaire après CLUSTER?


12

J'envisage d'utiliser CLUSTER pour réorganiser une table par un index. Je comprends que cette recréation des données de la table rend tous les index existants gonflés ou inutiles. J'ai vu quelques indications qu'un REINDEX est requis après un CLUSTER. J'ai trouvé d'autres références qui indiquent que CLUSTER fait un REINDEX. La documentation officielle ne dit rien du tout sur REINDEX faisant partie de CLUSTER ou requis (bien qu'elle suggère d'exécuter ANALYZE après le CLUSTER)

Quelqu'un peut-il définitivement (c'est-à-dire avec une sorte de référence aux documents officiels) dire si oui ou non un REINDEX est requis après un CLUSTER?


2
Je ne pense pas que ce soit nécessaire. clusterdéplace les lignes, il devra donc mettre à jour les informations d'index de toute façon.
a_horse_with_no_name

Oui, mais la théorie dans la moitié des discussions que j'ai trouvées est que cela fait gonfler l'indice.
TREE

Réponses:


12

Vous n'avez pas besoin de réindexer, car CLUSTERil le fait efficacement pour vous.

Plus précisément, CLUSTERverrouille la table source puis en crée une nouvelle copie ordonnée en fonction de l'index cible. Il crée des index sur la nouvelle copie, puis remplace l'ancienne table et les index par les nouveaux.

Notez que cela est également vrai VACUUM FULLdans la version 9.0+.

Si vous avez vu une discussion suggérant que les CLUSTERindex gonflés peuvent être des gens qui supposent que cela CLUSTERfonctionne comme avant la version 9.0 VACUUM FULL. Vous pouvez également voir et mal interpréter des discussions qui mentionnent le gonflement d'index causé par l'ancienne VACUUM FULLimplémentation et suggèrent CLUSTERune alternative .

Ceci est impliqué dans la documentation :

une copie temporaire de la table est créée qui contient les données de la table dans l'ordre d'index. Des copies temporaires de chaque index de la table sont également créées . Par conséquent, vous avez besoin d'espace libre sur le disque au moins égal à la somme de la taille de la table et des tailles d'index

Ce qu'il ne dit pas, mais devrait, c'est que ces copies temporaires remplacent alors la table d'origine . (Mine audacieuse).


1
Avez-vous une référence que CLUSTER remplace les index?
TREE

1
@TREE ajouté. Les documents ne vous disent pas explicitement que la table temporaire et les index remplacent alors les originaux, mais vous verrez que c'est le cas si vous regardez réellement le répertoire de données avant / après un CLUSTER ou si vous examinez le code source.
Craig Ringer

J'ai testé cela, et dans au moins mon scénario de test, la taille du fichier d'index a été réduite. Mais ce n'est qu'un scénario, et il pourrait y avoir de nombreuses variables qui affectent le comportement (nombre d'index, taille totale sur le disque, etc.) donc je ne peux pas faire confiance à un simple test.
TREE

1
@TREE Pour une certitude absolue dans la compréhension du comportement dans toutes les circonstances possibles, vous devrez lire le code source. Tout ce que je peux vous dire, c'est que je ne suis au courant d'aucune situation dans laquelle il CLUSTERn'y a pas de réécriture des index, et l'examen des fichiers réels en base/montre clairement le nouveau par relfilenode. Il semble que vous vous inquiétiez de problèmes que vous n'avez pas encore rencontrés.
Craig Ringer

8

Je suis avec a_horse_with_no_name à ce sujet: vous n'avez pas besoin de recréer les index. Outre que la CLUSTERdocumentation ne le mentionne pas, nous pouvons également consulter la REINDEXpage:

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 fournit un moyen de réduire la consommation d'espace de l'index en écrivant une nouvelle version de l'index sans les pages mortes. Voir Section 23.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.

De toute évidence, CLUSTERne tombe dans aucun de ces cas.

Et il y a une petite phrase dans les CLUSTERdocuments:

[lors du clustering] Des copies temporaires de chaque index de la table sont également créées.

Cela suggère que, tout comme la table elle-même, les index sont également réorganisés au cours du processus, ce qui rend la réindexation inutile.


La suggestion est certainement là et les tests semblent la confirmer. Je me sentirais mieux en me basant sur ce comportement si les documents indiquaient réellement que les index étaient recréés (en permanence).
TREE

2
Je vois des trucs pour un patch doc ici. Le manuel devrait être plus explicite sur la recréation des index.
Erwin Brandstetter

Mon soupçon à ce stade est que les développeurs ne veulent pas documenter officiellement ce comportement parce qu'ils ne veulent pas être liés de manière permanente à cette implémentation.
TREE

@TREE, il existe de nombreuses modifications de fonctionnalités entre les versions et les documents changent (principalement) en conséquence. Vraisemblablement, les spécifications changent également :), donc je ne vois aucun lien nulle part.
dezso

@dezso True, mais ils hésiteront à supprimer les fonctionnalités documentées. Étant donné la qualité de la documentation en général, je suppose toujours que l'omission de ce comportement est intentionnelle.
TREE

5

Trouvé une référence, dans la section Récupération de l'espace disque .

Si vous avez une telle table et que vous devez récupérer l'espace disque excédentaire qu'elle occupe, vous devrez utiliser VACUUM FULL, ou alternativement CLUSTER ou l'une des variantes de réécriture de table d'ALTER TABLE. Ces commandes réécrivent une nouvelle copie entière de la table et créent de nouveaux index pour elle.


-3

En analysant toutes les réponses, à mon avis, la bonne façon de le faire est de réindexer AVANT le cluster. Comme la documentation ne dit pas si le cluster fait ou non une réindexation, et seulement une copie de l'index, ordonné ou non, je pense qu'un index indexé se traduira par une meilleure table en cluster. Après cela, une analyse terminera le travail. Un vide plein avant tout semble inutile, à moins que le cluster et / ou la réindexation ne libèrent pas de tuples morts


Comme je l' ai mentionné dans la réponse acceptée, la documentation ne dit que les indices seront reconstruits, mais pas sur la page sur la commande CLUSTER.
TREE

Et à la fois CLUSTERet VACUUM FULLproduit une toute nouvelle table physique - il simplement ne peut y avoir mort après. L'espace utilisé par l'ancienne copie sera libéré à la fin de l'opération.
dezso

En effet. Il recrée la table et tous les index. Mais j'ai un doute sur l'index que le cluster utilise pour réorganiser la table. Il sera d'abord réindexé ou sera utilisé pour réorganiser la table telle quelle? Et après cela, l'index est recréé? Parce qu'un indice problématique pourrait générer des problèmes ...
Aislan Luiz Wendling
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.