Как оценить объем данных в базе PostgreSQL?

Ответ

Объем данных в PostgreSQL можно оценить с помощью системных функций. На последнем проекте общий размер базы составлял ~500 ГБ.

Основные запросы для анализа:

  1. Размер всей базы данных:

    SELECT pg_size_pretty(pg_database_size('имя_базы')) AS total_size;
  2. Размер таблиц с индексами (отсортировано):

    SELECT
        schemaname || '.' || tablename AS table,
        pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename)) AS total_size
    FROM pg_tables
    WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
    ORDER BY pg_total_relation_size(schemaname || '.' || tablename) DESC;

Практический опыт управления объемом:

  • Партиционирование больших таблиц (например, по датам) для упрощения управления и очистки.
  • Регулярный мониторинг и очистка устаревших данных с помощью autovacuum и кастомных скриптов.
  • Оптимизация хранения под SSD (настройка random_page_cost, effective_io_concurrency).

Ответ 18+ 🔞

Да ты посмотри, какие у нас тут запросы на разведку! Прямо как в шпионском фильме, только вместо секретных документов — размеры таблиц в базе. Ну что ж, давай разберёмся, как эту махину из 500 гигов обмерить, а то вдруг она уже на стенку полезла.

Вот тебе, друг мой, два главных инструмента для замера. Первый — как общий обмер всей квартиры:

SELECT pg_size_pretty(pg_database_size('имя_базы')) AS total_size;

Выполнишь — и сразу ясно, влезает ли твоя база на один жёсткий диск или уже пора арендовать под неё отдельный ангар.

А второй запрос — это уже детальная инвентаризация. Он покажет, кто у тебя там самый прожорливый, со всеми его индексами-придатками:

SELECT
    schemaname || '.' || tablename AS table,
    pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename)) AS total_size
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(schemaname || '.' || tablename) DESC;

Тут ты увидишь всех «толстячков» по убыванию. Обычно наверху оказывается какая-нибудь таблица логов, которая тихо и мирно сожрала половину твоего диска, пока ты чай пил.

А теперь, блядь, самое важное — что с этим безобразием делать? Опыт, сука, горький, но научил:

  • Партиционирование — это святое. Если у тебя таблица растёт как на дрожжах, особенно по датам, — режь её на куски. Так и чистить старьё проще, и запросы быстрее, и Postgres не охуевает от одного гигантского файла.
  • Чистка и вакуум — это как уборка в доме. Если не делать, зарастёшь говном и хламом. Настрой autovacuum нормально, а для особо старых данных, которые уже никому не уперёшь, пиши скрипты и выноси их нахуй по расписанию.
  • SSD — наше всё. Если база крутится на ссдшках (а в наше время иначе уже и стыдно), не забудь постгресу намекнуть. Поправь random_page_cost да effective_io_concurrency, чтобы он не тупил, как будто всё ещё с магнитным диском имеет дело.

Вот так-то, дружище. Следи за объёмами, не давай базе распухать, как царю Колбасу из сказки, а то однажды просто не влезешь.