Documentation PostgreSQL 14.22 » Annexes » Modules supplémentaires fournis » pg_visibility

Précédent | Niveau supérieur | Suivant
F.33. pg_trgm | Sommaire | F.35. postgres_fdw

## F.34. pg_visibility

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.

### F.34.1. Fonctions

`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.

### F.34.2. Auteur

Robert Haas `<rhaas@postgresql.org>`