Vous n'êtes pas identifié(e).

#26 02/06/2009 15:40:37

gleu
Administrateur

Re : VACUUM

Vu que j'ai enfin un peu de temps, j'ai relu le thread histoire de s'assurer de certaines choses.

Marc Cousin a écrit :

Non, on n'est pas d'accord smile

C'est le boulot de la fonction lazy_vacuum_heap, appelée après le nettoyage des index, dans le lazy. Elle fait un ItemIdSetUnused pour les tuples à supprimer, page par page, et réorganise les pages derrière si nécessaire. Tout ça se trouve dans lazy_scan_heap.
C'est aussi pour ça qu'on a un vacuum_cost_page_dirty, pour avoir le coût du 'salissage' d'une page quand on a du nettoyage dedans.

Désolé pour l'appropriation du thread, bil69, mais c'est un sujet passionnant smile

Aucun tuple n'est physiquement supprimé, ni dans les tables ni dans les index, avec un VACUUM simple. Un tuple invisible pour chaque transaction en cours est marqué comme réutilisable, c'est tout. Seule exception, si ça a vidé un groupe de blocs en fin de fichier et que postgres peut placer un verrou exclusif sur la table le temps de tronquer physiquement la table pour supprimer ce groupe de blocs. On est d'accord là-dessus ?


Guillaume.

Hors ligne

#27 02/06/2009 16:21:29

Marc Cousin
Membre

Re : VACUUM

Les tuple sont physiquement supprimés.

C'est la fonction lazy_vacuum_page qui s'en occupe. En fait l'enregistrement lui même n'est pas supprimé, mais son pointeur en début de bloc (l'ItemPointer) l'est, ce qui revient au même.
La donnée pourra aussi être écrasée juste après, puisqu'une fois le ménage fait dans les ItemPointers, on fait un PageRepairFragmentation (qui 'retasse' les données en début de bloc).


Marc.

Hors ligne

Pied de page des forums