J'ai une table avec 200 Go de taille occupée par les données et 180 Go de taille par les 6 index dessus. Il est gonflé à 30%, donc je veux récupérer l'espace indésirable qu'il occupe. Il est regroupé sur un job_id_id
index x.
Donc, pour récupérer l'espace, dois-je utiliser la cluster
commande ou la vacuum full
commande?
Quelle est la différence entre ces deux commandes?
L'
vacuum full
ordre par colonne est-il identique à lacluster
commande?L'index est-il recréé dans les deux commandes?
Dans mon cas, lequel sera le plus rapide?
La version de la base de données PostgreSQL est la 9.1
Réponses:
Pour vérifier ce qui se
CLUSTER
passe, j'ai pris un tableau pour le mien d'une expérience antérieure qui contenait essentiellement les 10 premiers millions d'entiers positifs. J'ai déjà supprimé certaines lignes et il y a une autre colonne également, mais celles-ci n'affectent que la taille réelle du tableau, donc ce n'est pas si intéressant.D'abord, ayant couru
VACUUM FULL
sur la tablefka
, j'ai pris sa taille:Voyons ensuite l'ordre physique des données depuis le tout début du tableau:
Supprimons maintenant quelques lignes:
Après cela, la taille du tableau signalée n'a pas changé. Voyons maintenant ce qui
CLUSTER
fait:Après l'opération, la taille de la table est passée de 338 à 296 Mo. Dans la
ctid
colonne, qui décrit l'emplacement physique du tuple dans la page, vous voyez également qu'il n'y a pas d'espace où se trouvait la correspondance de ligneid = 5
.Comme les tuples ont été réorganisés, les index auraient dû être recréés afin qu'ils pointent vers les bons endroits.
La différence semble donc
VACUUM FULL
ne pas ordonner les lignes. Pour autant que je sache, il existe une certaine différence dans le mécanisme utilisé par les deux commandes, mais d'un point de vue pratique, cela semble être la principale différence (seulement?).la source
ctid
colonne. Il s'avère que c'est une colonne système décrivant l'emplacement physique de la ligne dans sa table. postgresql.org/docs/current/ddl-system-columns.htmlhttp://www.postgresql.org/docs/9.1/static/sql-vacuum.html
http://www.postgresql.org/docs/9.1/static/sql-cluster.html
aussi intéressant: is-a-reindex-required-after-cluster
Mais peut-être que tout ce dont vous avez besoin est un simple
REINDEX
qui reconstruit un index en utilisant les données stockées dans la table de l'index, en remplaçant l'ancienne copie de l'index.http://www.postgresql.org/docs/9.1/static/sql-reindex.html
la source