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

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

Столбцы вывода 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).

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