pgstattuple — получение статистики на уровне кортежей#
Примечание
Эта страница переведена при помощи нейросети GigaChat.
Модуль pgstattuple предоставляет различные функции для получения статистики уровня кортежей.
Поскольку эти функции возвращают подробную информацию на уровне страниц, доступ к ним по умолчанию ограничен. По умолчанию только роль pg_stat_scan_tables имеет привилегию EXECUTE. Конечно, суперпользователи обходят это ограничение. После установки расширения пользователи могут выдавать команды GRANT, чтобы изменить привилегии функций и разрешить другим пользователям их выполнение. Однако может быть предпочтительнее добавить этих пользователей в роль pg_stat_scan_tables.
Функции#
pgstattuple(regclass) returns recordpgstattupleвозвращает физическую длину отношения, процент «мертвых» кортежей и другую информацию. Это может помочь пользователям определить, необходима ли вакуумизация или нет. Аргументом является имя целевого отношения (возможно, дополненное схемой) или его идентификатор. Например: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Описания выходных столбцов приведены в таблице ниже.
Столбцы вывода 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 recordpgstatindexвозвращает запись, содержащую информацию об индексе 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 recordpgstatginindexвозвращает запись, содержащую информацию об индексе 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 recordpgstathashindexвозвращает запись, содержащую информацию о хеш-индексе. Например: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 bigintpg_relpagesвозвращает количество страниц в отношении.pg_relpages(text) returns bigintЭто то же самое, что и
pg_relpages(regclass), за исключением того, что для нее целевое отношение задается в текстовом виде. Эта функция сохраняется из-за обратной совместимости до сих пор и будет считаться устаревшей в каком-то будущем выпуске.pgstattuple_approx(regclass) returns recordpgstattuple_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).
Столбцы вывода 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выводу, потому что карта свободного пространства дает точную цифру, но она не гарантируется быть точной до байта.