pg_visibility

Модуль pg_visibility обеспечивает возможность исследовать для таблицы карту видимости (visibility map, VM) и информацию о видимости на уровне страниц. Кроме того, он предоставляет функции для проверки целостности карты видимости и ее принудительного пересоздания.

Для хранения информации о видимости на уровне страниц используется три различных бита. Бит полной видимости в карте видимости означает, что все кортежи в соответствующей странице отношения являются видимыми для всех текущих и будущих транзакций. Бит полной заморозки в карте видимости означает, что все кортежи в этой странице являются замороженными; то есть никакой будущей операции очистки не понадобится модифицировать эту страницу, пока в ней не будет добавлен, изменен, удален или заблокирован кортеж. Бит PD_ALL_VISIBLE в заголовке страницы имеет то же значение, что и бит полной видимости в карте видимости, но он хранится в самой странице данных, а не в отдельной структуре данных. В большинстве случаев эти два бита будут согласованы, но бит полной видимости в странице иногда может быть задан, тогда как в карте видимости он сбрасывается при восстановлении после сбоя. Полученные значения также могут расходиться вследствие изменения, происходящего в промежутке между проверкой pg_visibility карты видимости и страницы данных. Кроме того, эти биты могут различаться из-за событий, приводящих к повреждению данных.

Функции, показывающие информацию о битах PD_ALL_VISIBLE, куда более затратны, нежели те, что обращаются только к карте видимости, так как они должны читать блоки данных отношения, а не только карту видимости (которая гораздо меньше). Функции, которые проверяют блоки данных отношения, тоже затратны.

Функции

pg_visibility_map(relation regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean) returns record
Возвращает биты полной видимости и полной заморозки в карте видимости для указанного блока указанного отношения.

pg_visibility(relation regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns record
Возвращает биты полной видимости и полной заморозки в карте видимости для указанного блока указанного отношения, а также бит PD_ALL_VISIBLE этого блока.

pg_visibility_map(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean) returns setof record
Возвращает биты полной видимости и полной заморозки в карте видимости для всех блоков указанного отношения.

pg_visibility(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns setof record
Возвращает биты полной видимости и полной заморозки в карте видимости для всех блоков указанного отношения, а также бит PD_ALL_VISIBLE каждого блока.

pg_visibility_map_summary(relation regclass, all_visible OUT bigint, all_frozen OUT bigint) returns record
Возвращает количество полностью видимых страниц и полностью замороженных страниц в отношении, согласно карте видимости.

pg_check_frozen(relation regclass, t_ctid OUT tid) returns setof tid
Возвращает идентификаторы TID незамороженных кортежей, хранящихся в страницах, помеченных как полностью замороженные в карте видимости. Если эти функции возвращают непустое множество TID, карта видимости повреждена.

pg_check_visible(relation regclass, t_ctid OUT tid) returns setof tid
Возвращает идентификаторы TID не полностью видимых кортежей, хранящихся в страницах, помеченных как полностью видимые в карте видимости. Если эти функции возвращают непустое множество TID, карта видимости повреждена.

pg_truncate_visibility_map(relation regclass) returns void
Усекает карту видимости для указанного отношения. Эта функция полезна, если вы полагаете, что карта видимости для этого отношения повреждена, и хотите принудительно ее восстановить. Первая же команда VACUUM, выполненная с заданным отношением после выполнения этой функции, просканирует все страницы в этом отношении и воссоздаст карту видимости. (Пока это не произойдет, запросы будут обрабатывать карту видимости как содержащую одни нули.)

По умолчанию эти функции разрешено выполнять только суперпользователям и членам роли pg_stat_scan_tables, за исключением pg_truncate_visibility_map(relation regclass), которую могут выполнять только суперпользователи.