Как устранить bloat таблиц в PostgreSQL: VACUUM и pg_repack

Вопрос: как устранить bloat таблиц в PostgreSQL?

Линия поддержки
Линия поддержки Ответы на вопросы пользователей
24 июня 2026

Разбор причин раздувания таблиц и индексов в PostgreSQL. Сравнение встроенных команд VACUUM / VACUUM FULL и расширения pg_repack для очистки дискового пространства.

Изображение записи

Комментарий пользователя

Почему в PostgreSQL базы раздуваются по объему на дисках даже при регулярном удалении старых записей через DELETE? Как правильно обслуживать PostgreSQL, чтобы не разориться на дисках для сервера?

Мария Шульгина Пользователь

Ответ специалиста

Здравствуйте, Мария! В вашем случае происходит bloat (раздувание) — это состояние, когда таблица занимает на диске значительно больше места, чем реально нужно. Технически это не баг, а фича для реализации транзакционности и MCC в PostgreSQL.

При выполнении запросов UPDATE или DELETE старые версии строк помечаются «мертвыми», но физически остаются в файле на диске. Получается, что чем чаще меняются данные, тем больше пустого места образуется внутри страниц таблицы и индексов. Для работы с этим процессом есть механизм VACUUM и расширение pg_repack.

VACUUM — это команда в PostgreSQL, которая используется для очистки базы данных от неактуальных строк и освобождения занимаемого ими места. 

Существует два вида команды:

  • VACUUM просто помечает устаревшие строки как доступные для повторного использования и не уменьшает физический размер файлов таблицы;
  • VACUUM FULL выполняет очистку и возвращает свободное место обратно операционной системе, уменьшая физический размер файла. Однако этот процесс требует блокировки таблицы, поэтому выполняется дольше и блокирует другие операции.
  • Александр Гришин

    Александр Гришин

    Руководитель по развитию продуктов хранения данных

pg_repack — это расширение для PostgreSQL, которое удаляет мертвые строки, оставшиеся после DELETE и UPDATE. Это позволяет дефрагментировать и компактно переписать таблицу или индекс без блокировки таблицы, в отличие от VACUUM FULL.

Работает расширение по следующему алгоритму: сначала создается временная «чистая» таблица‑копия с индексами, и в нее копируются все актуальные данные. Далее pg_repack следит за всеми изменениями в оригинальной таблице, догоняет произошедшие в ней изменения и переключает имена таблиц (на этом шаге блокировка все-таки производится, но длится она миллисекунды). Наконец, старый bloat‑файл удаляется.

Резюмируя: VACUUM используется для постоянной фоновой гигиены, а pg_repack — это операция «дефрагментации», которая используется, когда bloat уже накопился.

На самом деле основная сложность заключается не в запуске VACUUM или pg_repack, а в мониторинге bloat, выборе частоты обслуживания, минимизации блокировок на продакшене и тюнинге autovacuum под нагрузку.

В наших облачных базах данных эти процессы обычно проще контролировать: обслуживание, мониторинг и эксплуатационные настройки выполняются на уровне платформы, снижая риск деградации производительности из-за накопленного bloat.