pgstattuple — получение статистики на уровне кортежей
- :::{note} Эта страница переведена при помощи нейросети 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_len | bigint | Физическая длина отношения в байтах |
tuple_count | bigint | Количество активных кортежей |
tuple_len | bigint | Общая длина активных кортежей в байтах |
tuple_percent | float8 | Процент активных кортежей |
dead_tuple_count | bigint | Количество неактивных кортежей |
dead_tuple_len | bigint | Общая длина мертвых кортежей в байтах |
dead_tuple_percent | float8 | Процент мертвых кортежей |
free_space | bigint | Общее свободное пространство в байтах |
free_percent | float8 | Процент свободного пространства |
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
Выходные столбцы следующие:
Столбец | Тип | Описание |
---|---|---|
version | integer | Номер версии B-дерева |
tree_level | integer | Уровень дерева корневой страницы |
index_size | bigint | Общий размер индекса в байтах |
root_block_no | bigint | Расположение корневой страницы (ноль, если отсутствует) |
internal_pages | bigint | Количество страниц «внутренних» (верхнего уровня) |
leaf_pages | bigint | Количество листовых страниц |
empty_pages | bigint | Количество пустых страниц |
deleted_pages | bigint | Количество удаленных страниц |
avg_leaf_density | float8 | Средняя плотность листовых страниц |
leaf_fragmentation | float8 | Фрагментация листовых страниц |
Отчет 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
Выходные столбцы:
Столбец | Тип | Описание |
---|---|---|
version | integer | Номер версии GIN |
pending_pages | integer | Количество страниц в списке ожидания |
pending_tuples | bigint | Количество кортежей в списке ожидания |
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
Выходные столбцы:
Столбец | Тип | Описание |
---|---|---|
version | integer | Номер версии HASH |
bucket_pages | bigint | Количество страниц корзины |
overflow_pages | bigint | Количество переполняемых страниц |
bitmap_pages | bigint | Количество битовых карт |
unused_pages | bigint | Количество неиспользуемых страниц |
live_items | bigint | Количество активных кортежей |
dead_tuples | bigint | Количество мертвых кортежей |
free_percent | float | Процент свободного пространства |
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_len | bigint | Физическая длина отношения в байтах (точная) |
scanned_percent | float8 | Процент отсканированной таблицы |
approx_tuple_count | bigint | Количество живых кортежей (оценка) |
approx_tuple_len | bigint | Общая длина активных кортежей в байтах (оценка) |
approx_tuple_percent | float8 | Процент активных кортежей |
dead_tuple_count | bigint | Количество мертвых кортежей (точное значение) |
dead_tuple_len | bigint | Общая длина мертвых кортежей в байтах (точная) |
dead_tuple_percent | float8 | Процент мертвых кортежей |
approx_free_space | bigint | Общая свободная память в байтах (оценка) |
approx_free_percent | float8 | Процент свободного пространства |
В приведенном выше выводе цифры свободного места могут не точно соответствовать pgstattuple
выводу, потому что карта свободного пространства дает точную цифру, но она не гарантируется быть точной до байта.