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?
postgresql
ARBRE
la source
la source
cluster
déplace les lignes, il devra donc mettre à jour les informations d'index de toute façon.Réponses:
Vous n'avez pas besoin de réindexer, car
CLUSTER
il le fait efficacement pour vous.Plus précisément,
CLUSTER
verrouille 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 FULL
dans la version 9.0+.Si vous avez vu une discussion suggérant que les
CLUSTER
index gonflés peuvent être des gens qui supposent que celaCLUSTER
fonctionne comme avant la version 9.0VACUUM FULL
. Vous pouvez également voir et mal interpréter des discussions qui mentionnent le gonflement d'index causé par l'ancienneVACUUM FULL
implémentation et suggèrentCLUSTER
une alternative .Ceci est impliqué dans la documentation :
Ce qu'il ne dit pas, mais devrait, c'est que ces copies temporaires remplacent alors la table d'origine . (Mine audacieuse).
la source
CLUSTER
n'y a pas de réécriture des index, et l'examen des fichiers réels enbase/
montre clairement le nouveau parrelfilenode
. Il semble que vous vous inquiétiez de problèmes que vous n'avez pas encore rencontrés.Je suis avec a_horse_with_no_name à ce sujet: vous n'avez pas besoin de recréer les index. Outre que la
CLUSTER
documentation ne le mentionne pas, nous pouvons également consulter laREINDEX
page:De toute évidence,
CLUSTER
ne tombe dans aucun de ces cas.Et il y a une petite phrase dans les
CLUSTER
documents: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 source
Trouvé une référence, dans la section Récupération de l'espace disque .
la source
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
la source
CLUSTER
etVACUUM FULL
produit 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.