F.54. pg_visibility#

F.54. pg_visibility

F.54. pg_visibility

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

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

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

F.54.1. Функции

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), которую может выполнять только суперпользователь.

F.54.2. Автор

Robert Haas