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