F.56. pgstattuple — получение статистики на уровне кортежей #
Модуль pgstattuple
предоставляет различные функции для получения статистики на уровне кортежей.
Так как эти функции возвращают подробную информацию, относящуюся к уровню страницы, доступ к ним по умолчанию ограничен. Право EXECUTE
для них имеет только роль pg_stat_scan_tables
. Разумеется, суперпользователи могут обойти это ограничение. После того как это расширение установлено, можно поменять права доступа к этим функциям командами GRANT
и разрешить их выполнение другим пользователям. Однако предпочтительнее будет добавить этих пользователей в роль pg_stat_scan_tables
.
F.56.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.50.
Таблица F.50. Столбцы результата
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
Расположение страницы корня (0, если её нет) 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
, возвращающей приблизительные результаты. В качестве аргумента ей передаётся имя или 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.51.
Тогда как
pgstattuple
всегда производит полное сканирование таблицы и возвращает точное число живых и мёртвых кортежей (и их размер), а также точный объём свободного пространства, функцияpgstattuple_approx
пытается избежать полного сканирования и возвращает точную статистику только по мёртвым кортежам, а количество и объём живых кортежей, как и объём свободного пространства определяет приблизительно.Она делает это, пропуская страницы, в которых, согласно карте видимости, есть только видимые кортежи (если для страницы установлен соответствующий бит, предполагается, что она не содержит мёртвых кортежей). Для таких страниц эта функция узнаёт объём свободного пространства из карты свободного пространства и предполагает, что остальное пространство на странице занято живыми кортежами.
На страницах, которые нельзя пропустить, она сканирует каждый кортеж, отражает его наличие и размер в соответствующих счётчиках и суммирует свободное пространство на странице. В конце она оценивает приблизительно общее число живых кортежей, исходя из числа просканированных страниц и кортежей (так же, как VACUUM рассчитывает значение pg_class.reltuples).
Таблица F.51. Столбцы результата
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
в точности, потому что карта свободного пространства показывает верное значение, но не гарантируется, что оно будет точным до байта.
F.56.2. Авторы #
Тацуо Исии, Сатоши Нагаясу и Абхиджит Менон-Сен