PostgreSQL: как узнать размер таблицы, индексов и базы
Размер таблицы в PostgreSQL показывает запрос SELECT pg_size_pretty(pg_total_relation_size('orders'));. Эта функция считает таблицу вместе с индексами и TOAST-данными. Только данные таблицы возвращает pg_relation_size, а размер всей базы функция pg_database_size.
Размер одной таблицы
SELECT pg_size_pretty(pg_total_relation_size('orders')); -- таблица, индексы и TOAST
SELECT pg_size_pretty(pg_relation_size('orders')); -- только основные данные таблицы
SELECT pg_size_pretty(pg_indexes_size('orders')); -- только индексы
SELECT pg_size_pretty(pg_database_size(current_database())); -- вся текущая базаФункция | Что считает |
|---|---|
| Данные, индексы и TOAST-таблицы |
| Только основной файл данных |
| Данные и TOAST без индексов |
| Все индексы таблицы |
| Всю базу данных |
| Превращает байты в читаемый вид: |
Если имя таблицы содержит заглавные буквы или находится в другой схеме, пишите его в кавычках: 'public."Orders"' или 'sales.orders'.
Самые большие таблицы
SELECT schemaname,
relname AS table_name,
pg_size_pretty(pg_total_relation_size(relid)) AS total,
pg_size_pretty(pg_relation_size(relid)) AS data,
pg_size_pretty(pg_indexes_size(relid)) AS indexes,
n_live_tup AS approx_rows
FROM pg_stat_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;Сортируйте по числовому размеру в байтах, а не по строке из pg_size_pretty: текст 9 MB по алфавиту окажется больше 100 MB. Столбец n_live_tup показывает приблизительное число строк по статистике, без полного подсчёта.
Размеры всех баз
SELECT datname, pg_size_pretty(pg_database_size(datname)) AS size
FROM pg_database
ORDER BY pg_database_size(datname) DESC;Команды psql
psql -d mydb -c '\dt+' # таблицы с размерами
psql -d mydb -c '\di+' # индексы с размерами
psql -c '\l+' # базы данных с размерамиРазмер столбца и значения
SELECT pg_size_pretty(sum(pg_column_size(payload))) FROM orders; -- сколько занимает столбец payload
SELECT pg_column_size(payload) FROM orders LIMIT 1; -- размер одного значения в байтахПочему размер больше, чем данные
Размер файла включает «мёртвые» версии строк, которые остаются после UPDATE и DELETE, пока их не уберёт автоочистка. Если таблица заметно раздулась, проверьте статистику и выполните очистку:
SELECT relname, n_live_tup, n_dead_tup FROM pg_stat_user_tables WHERE relname = 'orders';
VACUUM (VERBOSE, ANALYZE) orders;Точное число строк
SELECT count(*) FROM orders; -- точно, но медленно на больших таблицах
SELECT reltuples::bigint AS estimate FROM pg_class WHERE relname = 'orders'; -- оценка по статистикеЧастые вопросы
Почему pg_relation_size показывает мало, а таблица занимает много?
Функция не учитывает индексы и TOAST. Большие значения (длинные тексты, JSON) хранятся в отдельной TOAST-таблице, поэтому смотрите pg_total_relation_size.
Как узнать размер только одной схемы?
Просуммируйте размеры таблиц схемы: SELECT pg_size_pretty(sum(pg_total_relation_size(c.oid))) FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = 'public' AND c.relkind = 'r';.