Перейти к основному содержимому

pg_visibility — информация о карте видимости и вспомогательные функции

примечание

Эта страница переведена при помощи нейросети GigaChat.

Модуль pg_visibility предоставляет средства для проверки карты видимости (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), которые могут выполняться только суперпользователями.