F.46. pgstattuple
Модуль pgstattuple предоставляет различные функции для получения статистики на уровне кортежей.
Так как эти функции возвращают подробную информацию, относящуюся к уровню страницы, только суперпользователь имеет право выполнять их (EXECUTE) после установки. После того как эти функции установлены, с помощью команды GRANT можно изменить права доступа к этим функциям, чтобы выполнять их могли не только суперпользователи. По умолчанию доступ к ним имеют члены роли pg_stat_scan_tables. За подробностями обратитесь к описанию команды GRANT.
F.46.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.34.
Таблица F.34. Столбцы результата
pgstattupleСтолбец Тип Описание table_lenbigintФизическая длина отношения в байтах tuple_countbigintКоличество «живых» кортежей tuple_lenbigintОбщая длина «живых» кортежей в байтах tuple_percentfloat8Процент «живых» кортежей dead_tuple_countbigintКоличество «мёртвых» кортежей dead_tuple_lenbigintОбщая длина «мёртвых» кортежей в байтах dead_tuple_percentfloat8Процент «мёртвых» кортежей free_spacebigintОбщий объём свободного пространства в байтах free_percentfloat8Процент свободного пространства Примечание
Значение
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Столбцы результата:
Столбец Тип Описание versionintegerНомер версии B-дерева tree_levelintegerУровень корневой страницы в дереве index_sizebigintОбщий объём индекса в байтах root_block_nobigintРасположение страницы корня (0, если её нет) internal_pagesbigintКоличество «внутренних» страниц (верхнего уровня) leaf_pagesbigintКоличество страниц на уровне листьев empty_pagesbigintКоличество пустых страниц deleted_pagesbigintКоличество удалённых страниц avg_leaf_densityfloat8Средняя плотность страниц на уровне листьев leaf_fragmentationfloat8Фрагментация на уровне листьев Выдаваемый размер индекса (
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Столбцы результата:
Столбец Тип Описание versionintegerНомер версии GIN pending_pagesintegerКоличество страниц в списке ожидающих обработки pending_tuplesbigintКоличество кортежей в списке ожидающих обработки -
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Столбцы результата:
Столбец Тип Описание versionintegerНомер версии HASH bucket_pagesbigintКоличество страниц групп overflow_pagesbigintКоличество страниц переполнения bitmap_pagesbigintКоличество страниц битовой карты unused_pagesbigintКоличество неиспользованных страниц live_itemsbigintКоличество «живых» кортежей dead_tuplesbigintКоличество «мёртвых» кортежей free_percentfloatПроцент свободного пространства -
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.35.
Тогда как
pgstattupleвсегда производит полное сканирование таблицы и возвращает точное число живых и мёртвых кортежей (и их размер), а также точный объём свободного пространства, функцияpgstattuple_approxпытается избежать полного сканирования и возвращает точную статистику только по мёртвым кортежам, а количество и объём живых кортежей, как и объём свободного пространства определяет приблизительно.Она делает это, пропуская страницы, в которых, согласно карте видимости, есть только видимые кортежи (если для страницы установлен соответствующий бит, предполагается, что она не содержит мёртвых кортежей). Для таких страниц эта функция узнаёт объём свободного пространства из карты свободного пространства и предполагает, что остальное пространство на странице занято живыми кортежами.
На страницах, которые нельзя пропустить, она сканирует каждый кортеж, отражает его наличие и размер в соответствующих счётчиках и суммирует свободное пространство на странице. В конце она оценивает приблизительно общее число живых кортежей, исходя из числа просканированных страниц и кортежей (так же, как VACUUM рассчитывает значение pg_class.reltuples).
Таблица F.35. Столбцы результата
pgstattuple_approxСтолбец Тип Описание table_lenbigintФизическая длина отношения в байтах (точная) scanned_percentfloat8Просканированный процент таблицы approx_tuple_countbigintКоличество «живых» кортежей (приблизительное) approx_tuple_lenbigintОбщая длина «живых» кортежей в байтах (приблизительная) approx_tuple_percentfloat8Процент «живых» кортежей dead_tuple_countbigintКоличество «мёртвых» кортежей (точное) dead_tuple_lenbigintОбщая длина «мёртвых» кортежей в байтах (точная) dead_tuple_percentfloat8Процент «мёртвых» кортежей approx_free_spacebigintОбщий объём свободного пространства в байтах (приблизительный) approx_free_percentfloat8Процент свободного пространства В показанном выше выводе показатели свободного пространства могут не соответствовать выводу
pgstattupleв точности, потому что карта свободного пространства показывает верное значение, но не гарантируется, что оно будет точным до байта.
F.46.2. Авторы
Тацуо Исии, Сатоши Нагаясу и Абхиджит Менон-Сен