F.47. pg_visibility — информация и утилиты карты видимости#
F.47. pg_visibility — информация и утилиты карты видимости #
Модуль pg_visibility
предоставляет средства для изучения
карты видимости (VM) и информации о видимости на уровне страницы таблицы.
Он также предоставляет функции для проверки целостности карты видимости и
ее принудительного перестроения.
Всего используется три различных бита для хранения информации о видимости на уровне страницы. Бит "все-видимые" в карте видимости указывает на то, что каждый кортеж на соответствующей странице отношения виден каждой текущей и будущей транзакции. Бит "все-замороженные" в карте видимости указывает на то, что каждый кортеж на странице заморожен; то есть, никакая будущая очистка не будет нуждаться в изменении страницы до тех пор, пока на этой странице не будет вставлен, обновлен, удален или заблокирован кортеж.
Бит PD_ALL_VISIBLE
в заголовке страницы имеет тот же смысл, что и бит "все-видимые" в карте видимости, но хранится в самой странице данных, а не в отдельной структуре данных.
Эти два бита обычно совпадают, но бит "все-видимые" на странице иногда может быть установлен, в то время как бит карты видимости не установлен после восстановления после сбоя. Значения также могут не совпадать из-за изменения, которое происходит после того, как pg_visibility
проверяет карту видимости и перед тем, как проверяет страницу данных. Любое событие, вызывающее повреждение данных, также может привести к несовпадению этих битов.
Функции, отображающие информацию о битах PD_ALL_VISIBLE
,
гораздо более затратны, чем те, которые только проверяют карту видимости,
потому что они должны читать блоки данных отношения, а не только
(гораздо меньшую) карту видимости. Функции, проверяющие блоки данных отношения,
также являются дорогостоящими.
F.47.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.47.2. Автор #
Robert Haas <rhaas@postgresql.org>