F.39. pg_visibility

Модуль pg_visibility даёт возможность исследовать карту видимости (Visibility Map, VM) и информацию о видимости на уровне страниц. Он также предоставляет функции для проверки целостности карты видимости и для принудительного её пересоздания.

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

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

F.39.1. Функции

pg_visibility_map(regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean) returns record

Возвращает биты полной видимости и полной заморозки в карте видимости для указанного блока заданного отношения.

pg_visibility(regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns record

Возвращает биты полной видимости и полной заморозки в карте видимости для указанного блока заданного отношения, а также бит PD_ALL_VISIBLE этого блока.

pg_visibility_map(regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean) returns setof record

Возвращает биты полной видимости и полной заморозки в карте видимости для каждого блока заданного отношения.

pg_visibility(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(regclass, all_visible OUT bigint, all_frozen OUT bigint) returns record

Возвращает число полностью видимых страниц и полностью замороженных страниц в отношении, согласно карте видимости.

pg_check_frozen(regclass, t_ctid OUT tid) returns setof tid

Возвращает идентификаторы TID незамороженных кортежей в страницах, помеченных как полностью замороженные в карте видимости. Если эта функция возвращает непустой набор TID, база данных испорчена.

pg_check_visible(regclass, t_ctid OUT tid) returns setof tid

Возвращает идентификаторы (TID) кортежей, которые не являются видимыми, несмотря на то, что содержащие их страницы помечены в карте видимости как полностью видимые. Если эта функция возвращает непустой набор TID, база данных испорчена.

pg_truncate_visibility_map(regclass) returns void

Аннулирует карту видимости для заданного отношения. Эта функция может быть полезна, только если вы подозреваете, что карта видимости для указанного отношения испорчена, и вы хотите пересоздать её. Первая же команда VACUUM, выполняемая с данным отношением после этой функции, просканирует все страницы в отношении и пересоздаст карту видимости.

По умолчанию выполнение этих функций не разрешено всем.

F.39.2. Автор

Роберт Хаас