CONGÉLATION SOUS VIDE vs VIDE COMPLÈTE


18

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

J'ai lu la doc mais elle dit juste que FULLverrouille les tables et FREEZE"fige" les tuples. Je pense que c'est la même chose. Ai-je tort?


Vous avez lu le doc? Ce serait une excellente occasion d'inclure un lien vers ce que vous avez lu ...
Erwin Brandstetter

Réponses:


12

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 sous vide marque le contenu d'une table avec un horodatage de transaction très spécial qui indique aux postgres qu'elle n'a jamais besoin d'être mise à vide. 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 ensuite jamais mise à jour, le démon autovacuum la passera simplement. De plus, la protection "enveloppante" dans postgresql ne se déclenchera jamais non plus sur cette table.

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


Alors, VACUUM FREEZEfaut-il un verrou exclusif sur la table? Il semble que cela devrait être le cas, sinon vous risqueriez de rendre soudainement visibles dans le monde entier les lignes des transactions actives. Je peux me méprendre ...
Parthian Shot

Pas de gel sous vide, pas de vide complet.
Scott Marlowe

6

Pour expliquer davantage ce que Jayadevan a écrit.

La façon dont Postgres travaille avec les transactions et pour garder une trace des données visibles consiste à comparer les ID de transaction internes. Cependant, étant donné que ces transactions sont un entier 32 bits tôt ou tard, elles se termineront et, par conséquent, 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 à -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.

Qu'est VACUUM FREEZE- ce que c'est essentiellement geler l'ID de transaction pour toutes les pages, qu'elles aient été modifiées ou non, de sorte que toutes les lignes actuelles soient considérées comme anciennes pour toutes les nouvelles transactions.

Cependant, à partir de la version 8.2 VACUUM FREEZEsont obsolètes et ne doivent pas être utilisés. Au lieu de cela, il y a les paramètres vacuum_freeze_table_ageet autovacuum_freeze_max_agequi spécifie combien de transactions peuvent se produire avant qu'une analyse complète ne soit effectuée sur la table (effectuez en fait un interne VACUUM FREEZEsur la table).


3
Comment se fait-il que les documents ne mentionnent pas d' VACUUM FREEZEêtre déconseillés / découragés?
dezso

Intéressant. Il l'a fait pour les versions entre 8.2 et 9.0. Peut-être qu'ils ont supprimé la dépréciation, car cela pourrait être une bonne fonctionnalité.
Jimmy Stenke

1

Copiez / collez de la réponse quand j'ai posé la même question - "un vide régulier marque l'espace vide pour une 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 RÉGULIER 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.


2
La question demande VACUUM FREEZEen particulier.
Erwin Brandstetter

Vrai - "différence entre ces types de vide dans PostgreSQL" - je pensais que la question portait sur les différences entre les types de vide.
Jayadevan
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.