web-dev-qa-db-fra.com

CONGÉLATION SOUS VIDE vs VIDE COMPLÈTE

Quelqu'un peut-il expliquer la différence entre ces types de VACUUM dans PostgreSQL?

J'ai lu le document mais il dit simplement que FULL verrouille les tables et FREEZE "fige" les tuples. Je pense que c'est la même chose. Ai-je tort?

18
Christian Maíz

Voici une courte réponse concise.

Le vide complet supprime un verrou exclusif et reconstruit la table afin qu'elle ne contienne aucun bloc vide (nous prétendons que le facteur de remplissage est de 100% pour l'instant).

Le gel du vide marque le contenu d'une table avec un horodatage de transaction très spécial qui indique aux postgres qu'il n'a jamais besoin d'être nettoyé. La prochaine mise à jour de cet identifiant figé disparaîtra.

Par exemple, la base de données template0 est gelée car elle ne change jamais (par défaut, vous ne pouvez pas vous y connecter.)

De temps en temps, le démon autovacuum vérifie une base de données et ses tables pour voir ce qui doit être nettoyé. Si une table est gelée sous vide et n'est jamais mise à jour, le démon autovacuum la passera simplement. De plus, la protection "enveloppante" de postgresql ne se déclenchera jamais non plus sur cette table.

tl; dr freezing marque une table comme ne nécessitant aucune maintenance autovac. La prochaine mise à jour la libérera.

12
Scott Marlowe

Pour expliquer davantage ce que Jayadevan a écrit.

La façon dont Postgres travaille avec les transactions et permet de garder une trace des données visibles consiste à comparer les ID de transaction internes. Cependant, puisque ces transactions sont un entier 32 bits tôt ou tard, elles se termineront, et donc la nouvelle transaction ressemblera à celle qu'elle a été effectuée dans le passé (et sera donc visible dans une transaction en cours alors qu'elle ne devrait pas), tandis que les transactions plus anciennes sembleront être effectuées à l'avenir (et comme l'avenir n'existe pas encore, ces données ne seront plus visibles).

Ce que Postgres fait pour contrer ce problème est d'affecter à chaque ligne suffisamment ancienne pour risquer de souffrir de cette enveloppe un identifiant de transaction spécial qui est toujours plus ancien que chaque transaction. Vous pouvez le voir comme si les ID de transaction valides vont de 0 à 2147483647, cela définira l'ID de transaction pour toutes les lignes actuelles sur -1.

Cependant, étant donné que le vide consiste essentiellement à marquer un espace vide pour une réutilisation, il ne fonctionne que sur les pages de données qui ont été modifiées.

Quoi VACUUM FREEZE do consiste essentiellement à geler l'ID de transaction pour toutes les pages, qu'elles aient été modifiées ou non, afin que toutes les lignes actuelles soient considérées comme anciennes pour toutes les nouvelles transactions.

Cependant, à partir de la version 8.2 VACUUM FREEZE est obsolète et ne doit pas être utilisé. Au lieu de cela, il y a les paramètres vacuum_freeze_table_age et autovacuum_freeze_max_age qui spécifie le nombre de transactions pouvant se produire avant qu'une analyse complète ne soit effectuée sur la table (effectuez en fait une _ VACUUM FREEZE sur la table).

6
Jimmy Stenke

Copiez/collez de la réponse quand j'ai posé la même question - "le vide régulier marque l'espace vide pour la réutilisation, et récupère l'espace vide à la fin d'une relation. Donc, si l'espace vide est au milieu, etc., il ne peut pas être récupéré vient d'être réutilisé.

vacuum full compacts une relation récupérant tout l'espace vide. Il nécessite un verrou exclusif et est mauvais pour les systèmes de production en général à cause de cela.

Le but du vide REGULIER n'est donc pas de récupérer de l'espace sur les tables mais de le rendre disponible pour une réutilisation ultérieure. Le but de l'aspirateur FULL est de récupérer tout l'espace perdu au détriment d'une serrure exclusive et de performances db pendant qu'il se produit.

Donc, comme l'aspirateur régulier n'est pas conçu pour tout récupérer, vous ne devriez pas être surpris qu'il n'ait pas tout récupéré. Essayez votre expérience sur de plus grands ensembles de données avec plus de suppressions aléatoires, etc. pour voir la différence entre le vide régulier et le vide complet. "

http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html

Pour ajouter à cela, le vide complet créera en fait de nouveaux fichiers pour la table (les fichiers existants auraient été réduits à 0). Ainsi, OS peut récupérer l'espace.

1
Jayadevan