El módulo pg_visibility proporciona un medio para examinar el
mapa de visibilidad (VM) y la información de visibilidad a nivel de página de una tabla.
También proporciona funciones para verificar la integridad de un mapa de visibilidad y para
forzar su reconstrucción.
Se utilizan tres bits diferentes para almacenar información sobre la visibilidad
a nivel de página. El bit «all-visible» en el mapa de visibilidad indica que cada
tupla en la página correspondiente de la relación es visible para cada transacción
actual y futura. El bit «all-frozen» en el mapa de visibilidad indica
que cada tupla en la página está congelada (frozen); es decir, ningún vacuum futuro necesitará
modificar la página hasta el momento en que se inserte, actualice, elimine o bloquee
una tupla en esa página.
El bit PD_ALL_VISIBLE del encabezado de la página tiene el
mismo significado que el bit «all-visible» en el mapa de visibilidad, pero se almacena
dentro de la propia página de datos en lugar de en una estructura de datos separada.
Normalmente, estos dos bits coincidirán, pero el bit «all-visible» de la página
a veces puede estar activado mientras que el bit del mapa de visibilidad está desactivado después de una
recuperación de caída (crash recovery). Los valores reportados también pueden diferir debido a un cambio que
ocurre después de que pg_visibility examina el mapa de visibilidad y
antes de que examine la página de datos. Cualquier evento que cause corrupción de datos
también puede hacer que estos bits no coincidan.
Las funciones que muestran información sobre los bits PD_ALL_VISIBLE
son mucho más costosas que aquellas que solo consultan el mapa de visibilidad,
porque deben leer los bloques de datos de la relación en lugar de solo el
mapa de visibilidad (que es mucho más pequeño). Las funciones que verifican los
bloques de datos de la relación son igualmente costosas.
pg_visibility_map(relation regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean) returns recordDevuelve los bits «all-visible» y «all-frozen» en el mapa de visibilidad para el bloque dado de la relación dada.
pg_visibility(relation regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns record
Devuelve los bits «all-visible» y «all-frozen» en el mapa de visibilidad para
el bloque dado de la relación dada, además del
bit PD_ALL_VISIBLE de ese bloque.
pg_visibility_map(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean) returns setof recordDevuelve los bits «all-visible» y «all-frozen» en el mapa de visibilidad para cada bloque de la relación dada.
pg_visibility(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns setof record
Devuelve los bits «all-visible» y «all-frozen» en el mapa de visibilidad para
cada bloque de la relación dada, además del bit PD_ALL_VISIBLE
de cada bloque.
pg_visibility_map_summary(relation regclass, all_visible OUT bigint, all_frozen OUT bigint) returns recordDevuelve el número de páginas «all-visible» y el número de páginas «all-frozen» en la relación de acuerdo con el mapa de visibilidad.
pg_check_frozen(relation regclass, t_ctid OUT tid) returns setof tidDevuelve los TIDs de las tuplas no congeladas almacenadas en páginas marcadas como «all-frozen» en el mapa de visibilidad. Si esta función devuelve un conjunto no vacío de TIDs, el mapa de visibilidad está corrupto.
pg_check_visible(relation regclass, t_ctid OUT tid) returns setof tidDevuelve los TIDs de las tuplas que no son «all-visible» almacenadas en páginas marcadas como «all-visible» en el mapa de visibilidad. Si esta función devuelve un conjunto no vacío de TIDs, el mapa de visibilidad está corrupto.
pg_truncate_visibility_map(relation regclass) returns void
Trunca el mapa de visibilidad para la relación dada. Esta función es
útil si crees que el mapa de visibilidad de la relación está corrupto
y deseas forzar su reconstrucción. El primer VACUUM
ejecutado en la relación dada después de que se ejecute esta función escaneará
cada página en la relación y reconstruirá el mapa de visibilidad. (Hasta que eso
se haga, las consultas tratarán el mapa de visibilidad como si contuviera solo ceros).
Por defecto, estas funciones son ejecutables solo por superusuarios y roles con privilegios
del rol pg_stat_scan_tables, con la excepción de
pg_truncate_visibility_map(relation regclass) que solo puede
ser ejecutada por superusuarios.
Robert Haas <[email protected]>