F.48. pgstattuple — получить статистику на уровне кортежей#
F.48. pgstattuple — получить статистику на уровне кортежей #
Модуль pgstattuple
предоставляет различные функции для получения статистики на уровне кортежей.
Поскольку эти функции возвращают подробную информацию на уровне страницы, доступ к ним ограничен по умолчанию. По умолчанию только роль pg_stat_scan_tables
имеет привилегию EXECUTE
. Конечно, суперпользователи обходят это ограничение. После установки расширения пользователи могут использовать команды GRANT
для изменения привилегий на функции, чтобы разрешить другим их выполнение. Однако, возможно, предпочтительнее добавить этих пользователей в роль pg_stat_scan_tables
.
F.48.1. Функции #
-
pgstattuple(regclass) returns record
pgstattuple
возвращает физическую длину отношения, процент "мертвых" кортежей и другую информацию. Это может помочь пользователям определить, нужно ли выполнять очистку или нет. Аргументом является имя целевого отношения (опционально с указанием схемы) или OID. Например: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
Выходные столбцы описаны в Таблица F.24.
Таблица F.24. Выходные столбцы
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)
, за исключением того, что целевое отношение указывается как TEXT. Эта функция сохраняется из-за обратной совместимости на данный момент и будет устаревать в будущих версиях.-
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)
, за исключением того, что целевой индекс указывается как TEXT. Эта функция сохраняется из-за обратной совместимости на данный момент и будет устаревать в будущих версиях.-
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
возвращает запись, содержащую информацию о HASH-индексе. Например: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)
, за исключением того, что целевое отношение указывается как TEXT. Эта функция сохраняется из-за обратной совместимости на данный момент и будет устаревать в будущих версиях.-
pgstattuple_approx(regclass) returns record
pgstattuple_approx
- это более быстрый альтернативный вариантpgstattuple
, который возвращает приблизительные результаты. Аргументом является имя или OID целевого отношения. Например: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
Выходные столбцы описаны в Таблица F.25.
Где
pgstattuple
всегда выполняет полное сканирование таблицы и возвращает точное количество живых и мертвых кортежей (и их размеры) и свободное пространство,pgstattuple_approx
пытается избежать полного сканирования таблицы и возвращает точную статистику мертвых кортежей вместе с приближенным количеством и размером живых кортежей и свободным пространством.Он делает это, пропуская страницы, которые содержат только видимые кортежи согласно карте видимости (если у страницы установлен соответствующий бит VM, то предполагается, что она не содержит удаленных кортежей). Для таких страниц он вычисляет значение свободного пространства из карты свободного пространства и предполагает, что остальное пространство на странице занято живыми кортежами.
Для страниц, которые нельзя пропустить, сканируется каждый кортеж, записывается его присутствие и размер в соответствующие счетчики, и суммируется свободное место на странице. В конце оценивается общее количество активных кортежей на основе количества просканированных страниц и кортежей (так же, как VACUUM оценивает pg_class.reltuples).
Таблица F.25.
pgstattuple_approx
Output ColumnsСтолбец Тип Описание 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
, поскольку карта свободного пространства дает нам точное значение, но не гарантирует точность до байта.
F.48.2. Авторы #
Tatsuo Ishii, Satoshi Nagayasu и Abhijit Menon-Sen