F.49. pgstattuple#

F.49. pgstattuple

F.49. pgstattuple

Модуль pgstattuple предоставляет различные функции для получения статистики на уровне кортежей.

Поскольку эти функции возвращают подробную информацию на уровне страницы, доступ к ним ограничен по умолчанию. По умолчанию только роль pg_stat_scan_tables имеет привилегию EXECUTE. Конечно, суперпользователи обходят это ограничение. После установки расширения пользователи могут использовать команды GRANT для изменения привилегий на функции, чтобы разрешить другим их выполнение. Однако, возможно, предпочтительнее добавить этих пользователей в роль pg_stat_scan_tables.

F.49.1. Функции

pgstattuple(regclass) returns record

pgstattuple возвращает физическую длину отношения, процент "мертвых" кортежей и другую информацию. Это может помочь пользователям определить, нужно ли выполнять очистку или нет. Аргументом является имя целевого отношения (опционально с указанием схемы) или OID. Например:

test=> SELECT * FROM pgstattuple('pg_catalog.pg_proc');
-[ RECORD 1 ]------+-------
table_len          | 458752
tuple_count        | 1470
tuple_len          | 438896
tuple_percent      | 95.67
dead_tuple_count   | 11
dead_tuple_len     | 3157
dead_tuple_percent | 0.69
free_space         | 8932
free_percent       | 1.95

Выходные столбцы описаны в Таблица F.22.

Таблица F.22. Выходные столбцы pgstattuple

СтолбецТипОписание
table_lenbigintФизическая длина отношения в байтах
tuple_countbigintКоличество активных кортежей
tuple_lenbigintОбщая длина активных кортежей в байтах
tuple_percentfloat8Процент живых кортежей
dead_tuple_countbigintКоличество удаленных кортежей
dead_tuple_lenbigintОбщая длина удаленных кортежей в байтах
dead_tuple_percentfloat8Процент мертвых кортежей
free_spacebigintОбщее количество свободного места в байтах
free_percentfloat8Процент свободного пространства

Примечание

Всегда table_len будет больше суммы tuple_len, dead_tuple_len и free_space. Разница учитывается фиксированными издержками на страницу, таблицей указателей на кортежи на каждой странице и заполнением для обеспечения правильного выравнивания кортежей.

pgstattuple приобретает только чтение блокировки на отношение. Поэтому результаты не отражают мгновенный снимок; одновременные обновления повлияют на них.

pgstattuple судит, что кортеж является мертвым, если HeapTupleSatisfiesDirty возвращает false.

pgstattuple(text) returns record

Это то же самое, что и pgstattuple(regclass), за исключением того, что целевое отношение указывается как TEXT. Эта функция сохраняется из-за обратной совместимости на данный момент и будет устаревать в будущих версиях.

pgstatindex(regclass) returns record

pgstatindex возвращает запись, содержащую информацию о B-дереве индекса. Например:

test=> SELECT * FROM pgstatindex('pg_cast_oid_index');
-[ RECORD 1 ]------+------
version            | 2
tree_level         | 0
index_size         | 16384
root_block_no      | 1
internal_pages     | 0
leaf_pages         | 1
empty_pages        | 0
deleted_pages      | 0
avg_leaf_density   | 54.27
leaf_fragmentation | 0

Выходные столбцы:

СтолбецТипОписание
versionintegerНомер версии B-дерева
tree_levelintegerУровень дерева корневой страницы
index_sizebigintОбщий размер индекса в байтах
root_block_nobigintМестоположение корневой страницы (ноль, если отсутствует)
internal_pagesbigintКоличество внутренних (верхних) страниц
leaf_pagesbigintКоличество листовых страниц
empty_pagesbigintКоличество пустых страниц
deleted_pagesbigintКоличество удаленных страниц
avg_leaf_densityfloat8Средняя плотность листовых страниц
leaf_fragmentationfloat8Фрагментация страницы листа

Сообщаемый размер индекса index_size обычно соответствует на одну страницу больше, чем учитывается страницами internal_pages + leaf_pages + empty_pages + deleted_pages, потому что он также включает метастраницу индекса.

Как и с pgstattuple, результаты накапливаются постранично и не следует ожидать, что они представляют мгновенный снимок всего индекса.

pgstatindex(text) returns record

Это то же самое, что и pgstatindex(regclass), за исключением того, что целевой индекс указывается как TEXT. Эта функция сохраняется из-за обратной совместимости на данный момент и будет устаревать в будущих версиях.

pgstatginindex(regclass) returns record

pgstatginindex возвращает запись, содержащую информацию о GIN-индексе. Например:

test=> SELECT * FROM pgstatginindex('test_gin_index');
-[ RECORD 1 ]--+--
version        | 1
pending_pages  | 0
pending_tuples | 0

Выходные столбцы:

СтолбецТипОписание
versionintegerНомер версии GIN
pending_pagesintegerКоличество страниц в списке ожидания
pending_tuplesbigintКоличество кортежей в списке ожидающих

pgstathashindex(regclass) returns record

pgstathashindex возвращает запись, содержащую информацию о HASH-индексе. Например:

test=> select * from pgstathashindex('con_hash_index');
-[ RECORD 1 ]--+-----------------
version        | 4
bucket_pages   | 33081
overflow_pages | 0
bitmap_pages   | 1
unused_pages   | 32455
live_items     | 10204006
dead_items     | 0
free_percent   | 61.8005949100872

Выходные столбцы:

СтолбецТипОписание
versionintegerномер версии HASH
bucket_pagesbigintКоличество страниц ведер
overflow_pagesbigintКоличество страниц переполнения
bitmap_pagesbigintКоличество страниц битовой карты
unused_pagesbigintКоличество неиспользуемых страниц
live_itemsbigintКоличество активных кортежей
dead_tuplesbigintКоличество удаленных кортежей
free_percentfloatПроцент свободного пространства

pg_relpages(regclass) returns bigint

pg_relpages возвращает количество страниц в отношении.

pg_relpages(text) returns bigint

Это то же самое, что и pg_relpages(regclass), за исключением того, что целевое отношение указывается как TEXT. Эта функция сохраняется из-за обратной совместимости на данный момент и будет устаревать в будущих версиях.

pgstattuple_approx(regclass) returns record

pgstattuple_approx - это более быстрый альтернативный вариант pgstattuple, который возвращает приблизительные результаты. Аргументом является имя или OID целевого отношения. Например:

test=> SELECT * FROM pgstattuple_approx('pg_catalog.pg_proc'::regclass);
-[ RECORD 1 ]--------+-------
table_len            | 573440
scanned_percent      | 2
approx_tuple_count   | 2740
approx_tuple_len     | 561210
approx_tuple_percent | 97.87
dead_tuple_count     | 0
dead_tuple_len       | 0
dead_tuple_percent   | 0
approx_free_space    | 11996
approx_free_percent  | 2.09

Выходные столбцы описаны в Таблица F.23.

Где pgstattuple всегда выполняет полное сканирование таблицы и возвращает точное количество живых и мертвых кортежей (и их размеры) и свободное пространство, pgstattuple_approx пытается избежать полного сканирования таблицы и возвращает точную статистику мертвых кортежей вместе с приближенным количеством и размером живых кортежей и свободным пространством.

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

Для страниц, которые нельзя пропустить, сканируется каждый кортеж, записывается его присутствие и размер в соответствующие счетчики, и суммируется свободное место на странице. В конце оценивается общее количество активных кортежей на основе количества просканированных страниц и кортежей (так же, как VACUUM оценивает pg_class.reltuples).

Таблица F.23. pgstattuple_approx Output Columns

СтолбецТипОписание
table_lenbigintФизическая длина отношения в байтах (точная)
scanned_percentfloat8Процент сканирования таблицы
approx_tuple_countbigintКоличество живых кортежей (приблизительно)
approx_tuple_lenbigintОбщая длина активных кортежей в байтах (приблизительно)
approx_tuple_percentfloat8Процент живых кортежей
dead_tuple_countbigintКоличество удаленных кортежей (точное)
dead_tuple_lenbigintОбщая длина удаленных кортежей в байтах (точная)
dead_tuple_percentfloat8Процент мертвых кортежей
approx_free_spacebigintОбщий объем свободного пространства в байтах (приблизительный)
approx_free_percentfloat8Процент свободного пространства

В вышеприведенном выводе цифры свободного пространства могут не совпадать точно с выводом функции pgstattuple, поскольку карта свободного пространства дает нам точное значение, но не гарантирует точность до байта.

F.49.2. Авторы

Tatsuo Ishii, Satoshi Nagayasu и Abhijit Menon-Sen