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

pgstattuple — получение статистики на уровне кортежей

примечание

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

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

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

Функции

pgstattuple(regclass) returns record

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

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

Описания выходных столбцов приведены в таблице ниже.

(ru-ru.PGSTATTUPLE-COLUMNS)= Столбцы вывода 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), за исключением того, что целевая связь задается в текстовом виде. Эта функция оставлена из-за обратной совместимости, в будущем она может перейти в разряд устаревших.

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), за исключением того, что для нее целевое отношение задается в текстовом виде. Функция оставлена для обратной совместимости и будет объявлена устаревшей в каком-то будущем выпуске.

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 возвращает запись, содержащую информацию о хеш-индексе. Например:

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), за исключением того, что для нее целевое отношение задается в текстовом виде. Эта функция сохраняется из-за обратной совместимости до сих пор и будет считаться устаревшей в каком-то будущем выпуске.

pgstattuple_approx(regclass) returns record

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

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

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

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

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

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

(ru-ru.PGSTATAPPROX-COLUMNS)= Столбцы вывода pgstattuple_approx:

СтолбецТипОписание
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 выводу, потому что карта свободного пространства дает точную цифру, но она не гарантируется быть точной до байта.