Quelqu'un peut-il expliquer la différence entre ces types de VACUUM
dans PostgreSQL?
J'ai lu la doc mais elle dit juste que FULL
verrouille les tables et FREEZE
"fige" les tuples. Je pense que c'est la même chose. Ai-je tort?
Quelqu'un peut-il expliquer la différence entre ces types de VACUUM
dans PostgreSQL?
J'ai lu la doc mais elle dit juste que FULL
verrouille les tables et FREEZE
"fige" les tuples. Je pense que c'est la même chose. Ai-je tort?
Réponses:
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.
VACUUM FREEZE
faut-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 ...
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 FREEZE
sont obsolètes et ne doivent pas être utilisés. Au lieu de cela, il y a les paramètres vacuum_freeze_table_age
et autovacuum_freeze_max_age
qui 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 FREEZE
sur la table).
VACUUM FREEZE
être déconseillés / découragés?
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.
VACUUM FREEZE
en particulier.