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