DBAtlas · Атлас эксплуатации баз данных

Вывести размер таблиц с разбивкой на heap / индексы / TOAST и самые большие индексы

PostgreSQLХранение

Команда

SELECT n.nspname AS schema_name,
       c.relname AS table_name,
       pg_size_pretty(pg_total_relation_size(c.oid)) AS total,
       pg_size_pretty(pg_relation_size(c.oid)) AS heap,
       pg_size_pretty(pg_indexes_size(c.oid)) AS indexes,
       pg_size_pretty(pg_total_relation_size(c.oid) - pg_relation_size(c.oid) - pg_indexes_size(c.oid)) AS toast_fsm_vm,
       round(100.0 * pg_total_relation_size(c.oid) / NULLIF(pg_database_size(current_database()), 0), 1) AS pct_of_db
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'm')
  AND n.nspname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(c.oid) DESC
LIMIT 20;

-- Largest indexes and their usage counts
SELECT s.schemaname,
       s.relname AS table_name,
       s.indexrelname AS index_name,
       pg_size_pretty(pg_relation_size(s.indexrelid)) AS index_size,
       s.idx_scan,
       i.indisunique,
       i.indisprimary
FROM pg_stat_user_indexes s
JOIN pg_index i ON i.indexrelid = s.indexrelid
ORDER BY pg_relation_size(s.indexrelid) DESC
LIMIT 20;

Что делает

Показывает самые большие таблицы с разбивкой на общий объём, heap, индексы и TOAST (+FSM/VM) и их долю в базе данных; а также самые большие индексы с числом сканирований и признаками unique/primary.

Когда использовать

Чтобы при росте использования диска найти, откуда берётся рост (данные, индексы или TOAST), и выявить большие неиспользуемые индексы.

Внимание

Функции размера обращаются к файловой системе для каждого отношения и могут работать медленно в базах с десятками тысяч таблиц. Секционированный родитель (relkind 'p') сам занимает 0 байт и исключён; для итога по иерархии: SELECT pg_size_pretty(sum(pg_total_relation_size(relid))) FROM pg_partition_tree('sales'); Большие индексы с idx_scan = 0 — кандидаты на удаление, но счётчики охватывают только время с последнего сброса статистики и только этот сервер (использование на репликах не видно); индексы unique/primary обеспечивают ограничения и не удаляются.

Открыть в DBAtlas →

Связанные материалы