Le module pg_visibility fournit la possibilité d'examiner la visibility map (VM) et les informations de visibilité au niveau bloc d'une table. Il fournit aussi des fonctions permettant de vérifier l'intégrité d'une visibility map et de forcer sa reconstruction.
Trois bits différents sont utilisés pour enregistrer des informations sur la visibilité au niveau des blocs. L'octet totalement-visible (all-visible) de la visibility map indique que chaque ligne d'un bloc donné d'une relation est visible pour toute transaction courante et future. L'octet totalement-figé (all- frozen) de la visibility map indique que chaque ligne du bloc est figée, c'est-à-dire qu'aucun vacuum n'aura besoin de modifier le bloc tant qu'une ligne n'est pas insérée, mise à jour, supprimée ou verrouillée dans ce bloc. Le bit PD_ALL_VISIBLE dans l'en-tête de page a la même signification que l'octet totalement-visible de la visibility map, mais il est stocké au sein du bloc plutôt que dans une structure de donnée séparée. Ces deux bits seront normalement identiques, mais le bit de niveau de bloc peut parfois rester défini pendant que la visibility map est purgée lors de la récupération suite à un crash ; ou ils peuvent être différents suite à un changement survenant après que pg_visibility ait examiné la visibility map et avant qu'il ait examiné le bloc donnée. Tout événement causant une corruption de données peut aussi un désaccord sur ces trois bits.
Les fonctions qui affichent les informations concernant le bit PD_ALL_VISIBLE sont plus beaucoup plus coûteuses que celles qui consultent uniquement la visibility map. En effet, elles doivent lire les blocs de données des relations plutôt que de ne s'intéresser qu'à la visibility map (qui est bien plus petite). Les fonctions qui vérifient les blocs de données de la relation sont aussi très coûteuses.
Renvoie tous les octets complétement visibles et complétement figés de la visibility map pour un bloc donné pour une relation donnée.
Renvoie tous les octets complétement visibles et complétement figés de la visibility map pour un bloc donné pour une relation donnée ainsi que l'octet PD_ALL_VISIBLE pour le bloc.
Renvoie tous les octets complétement visibles et complétement figés de la visibility map pour un bloc donné pour une relation donnée.
Renvoie tous les octets complétement visibles et complétement figés de la visibility map pour un bloc donné pour une relation donnée, ainsi que l'octet PD_ALL_VISIBLE pour le bloc.
Renvoie le nombre de pages complétement visibles ainsi que le nombre de pages complétement figées de la relation, en concordance avec la visibility map.
Renvoie le TID (identifiant de ligne) des lignes non gelées présentes dans les pages marquées complètement figés dans la visibility map. Si cette fonction renvoie un ensemble non vide de TID, la visibility map est corrompue.
Renvoie les TID (identifiants de lignes) de tous les enregistrements qui ne sont pas all-visible enregistrés dans des pages marquées all-visible dans la visibility map. Si cette fonction renvoie un ensemble non vide, la visibility map est corrompue.
Tronque la visibility map de la relation indiquée. Cette fonction est utile si vous pensez que la visibility map de cette relation est corrompue et que vous souhaitez forcer sa reconstruction. Le premier VACUUM exécuté sur cette relation après l'exécution de cette fonction parcourera chaque bloc de la relation et reconstruiera la visibility map. (Tant que cela ne sera pas fait, les requêtes traiteront la visibility map comme ne contenant que des zéros.)
Par défaut, ces fonctions ne sont exécutables que par des superutilisateurs et les membres du rôle pg_stat_scan_tables, à l'exception de pg_truncate_visibility_map(relation regclass) qui ne peut être executée que par des superutilisateurs.
Robert Haas <rhaas@postgresql.org>