pg_visibility
Исследование для определенной таблицы карты видимости.
Схема размещения:
ext
.Функциональность расширения 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 | record | Возвращает биты полной видимости и полной заморозки в карте видимости для указанного блока заданного отношения |
pg_visibility | relation regclass ;blkno bigint ;all_visible OUT boolean ;all_frozen OUT boolean ;pd_all_visible OUT boolean | record | Возвращает биты полной видимости и полной заморозки в карте видимости для указанного блока заданного отношения, а также бит PD_ALL_VISIBLE этого блока |
pg_visibility_map | relation regclass ;blkno OUT bigint ;all_visible OUT boolean ;all_frozen OUT boolean | setof record | Возвращает биты полной видимости и полной заморозки в карте видимости для каждого блока заданного отношения |
pg_visibility | relation regclass ;blkno OUT bigint ;all_visible OUT boolean ;all_frozen OUT boolean ;pd_all_visible OUT boolean | setof record | Возвращает биты полной видимости и полной заморозки в карте видимости для каждого блока заданного отношения, а также бит PD_ALL_VISIBLE каждого блока |
pg_visibility_map_summary | relation regclass ;all_visible OUT bigint ;all_frozen OUT bigint | record | Возвращает число полностью видимых страниц и полностью замороженных страниц в отношении согласно карте видимости |
pg_check_frozen | relation regclass ;t_ctid OUT tid | setof tid | Возвращает идентификаторы TID незамороженных кортежей в страницах, помеченных как полностью замороженные в карте видимости. Если эта функция возвращает непустой набор TID , карта видимости испорчена |
pg_check_visible | relation regclass ;t_ctid OUT tid | setof tid | Возвращает идентификаторы TID не полностью видимых кортежей в страницах, помеченных как полностью видимые в карте видимости. Если эта функция возвращает непустой набор TID , карта видимости испорчена |
pg_truncate_visibility_map | relation regclass | void | Аннулирует карту видимости для заданного отношения; функция полезна, если существует вероятность, что карта видимости для указанного отношения испорчена, и ее нужно принудительно пересоздать; первая же команда VACUUM , выполняемая с данным отношением после этой функции, просканирует все страницы в отношении и пересоздаст карту видимости |
По умолчанию функции расширения разрешено выполнять только суперпользователям и членам роли
pg_stat_scan_tables
, кроме pg_truncate_visibility_map(relation regclass)
, которую могут выполнять только суперпользователи.SELECT pg_visibility_map('username_test');
Пример результата выполнения запроса:
Раскрыть type=sqlpg_visibility_map ------------------- (0,f,f) (1 row)
Дополнительную информацию по поставляемому модулю pg_visibility можно получить по ссылке.