PostgreSQL: как узнать размер таблицы, индексов и базы

Категория: Postgresql · Язык: SQL · Обновлено:

Размер таблицы в PostgreSQL показывает запрос SELECT pg_size_pretty(pg_total_relation_size('orders'));. Эта функция считает таблицу вместе с индексами и TOAST-данными. Только данные таблицы возвращает pg_relation_size, а размер всей базы функция pg_database_size.

Размер одной таблицы

SQL
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()));  -- вся текущая база

Функция

Что считает

pg_total_relation_size

Данные, индексы и TOAST-таблицы

pg_relation_size

Только основной файл данных

pg_table_size

Данные и TOAST без индексов

pg_indexes_size

Все индексы таблицы

pg_database_size

Всю базу данных

pg_size_pretty

Превращает байты в читаемый вид: 12 MB

Если имя таблицы содержит заглавные буквы или находится в другой схеме, пишите его в кавычках: 'public."Orders"' или 'sales.orders'.

Самые большие таблицы

SQL
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 показывает приблизительное число строк по статистике, без полного подсчёта.

Размеры всех баз

SQL
SELECT datname, pg_size_pretty(pg_database_size(datname)) AS size
FROM pg_database
ORDER BY pg_database_size(datname) DESC;

Команды psql

Bash
psql -d mydb -c '\dt+'          # таблицы с размерами
psql -d mydb -c '\di+'          # индексы с размерами
psql -c '\l+'                   # базы данных с размерами

Размер столбца и значения

SQL
SELECT pg_size_pretty(sum(pg_column_size(payload))) FROM orders;   -- сколько занимает столбец payload
SELECT pg_column_size(payload) FROM orders LIMIT 1;                -- размер одного значения в байтах

Почему размер больше, чем данные

Размер файла включает «мёртвые» версии строк, которые остаются после UPDATE и DELETE, пока их не уберёт автоочистка. Если таблица заметно раздулась, проверьте статистику и выполните очистку:

SQL
SELECT relname, n_live_tup, n_dead_tup FROM pg_stat_user_tables WHERE relname = 'orders';
VACUUM (VERBOSE, ANALYZE) orders;

Точное число строк

SQL
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';.