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.
pg_visibility_map(relation regclass, blkno bigint, all_visible
OUT boolean, all_frozen OUT boolean) renvoie un enregistrement
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.
pg_visibility(relation regclass, blkno bigint, all_visible OUT
boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns setof record
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.
pg_visibility_map(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean) returns setof record
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.
pg_visibility(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns setof record
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.
pg_visibility_map_summary(relation regclass, all_visible OUT
bigint, all_frozen OUT bigint) returns setof record
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.
pg_check_frozen(relation regclass, t_ctid OUT tid) returns setof tid
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.
pg_check_visible(relation regclass, t_ctid OUT tid) returns setof tid
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.
pg_truncate_visibility_map(relation regclass) returns void
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
super-utilisateurs 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 super-utilisateurs.
Robert Haas <rhaas@postgresql.org>