Chaque relation a une carte de visibilité (VM acronyme de
Visibility Map) pour garder trace des pages
contenant seulement des lignes connues pour être visibles par toutes les
transactions actives ; elle conserve aussi la liste des blocs contenant
uniquement des lignes gelées. Elle est stockée en dehors du fichier de données dans
un fichier séparé nommé suivant le numéro relfilenode de la relation, auquel
est ajouté le suffixe _vm
. Par exemple, si le relfilenode
de la relation est 12345, la VM est stockée dans un fichier appelé
12345_vm
, dans le même répertoire que celui du fichier
de données. Notez que les index n'ont pas de VM.
La carte de visibilité enregistre deux bits pour chaque bloc de la table. Le premier bit, s'il vaut 1, indique si le bloc associé ne contient que des enregistrements visibles ou, pour le dire autrement, si le bloc ne contient aucune ligne devait être nettoyée par un VACUUM. Cette information peut aussi être utilisée par les parcours d'index seul pour répondre à des requêtes n'utilisant que les informations stockées dans les entrées de l'index. Le deuxième bit, s'il vaut 1, signifie que toutes les lignes du bloc associé ont été gelées. Cela signifie que même un vacuum anti-wraparound n'a pas besoin de traiter ce bloc.
Chaque fois qu'un bit est à 1, la condition est vraie à coup sûr. Par contre, dans le cas contraire, la condition peut être vraie comme fausse. Les bits de la carte de visibilité ne sont initialisés que par le VACUUM, mais sont désinitialisés par toutes opérations de modification des données sur une page.
Le module pg_visibility peut être utilisé pour examiner les informations enregistrées dans la carte de visibilité.