Если коротко, Postgres никогда не удаляет строки сразу (из-за MVCC), а просто помечает их как «мёртвые». Со временем таких мёртвых строк становится много, и таблица начинает тормозить и расти.
Тут на сцену выходит ПЫЛЕСОС (нет, не от dyson | типа GC в Go, кстати):
1. команда VACUUM – убирает мусор (мертвые строки), освобождает место для новых строк, но размер файла таблицы не уменьшает. Не блокирует работу таблицы (идеален для регулярной чистки).
2. команда VACUUM FULL – убирает мусор жёстко, переписывая всю таблицу и освобождая место ОС. Минус – таблица полностью блокируется, пока работает FULL. Использовать редко и осторожно.
3. AUTOVACUUM – работает из коробки, запускается автоматом, но иногда не справляется (например, после массовых DELETE или UPDATE). Тогда ручной VACUUM твой бро.
Когда стоит запускать вручную:
- Удалил/обновил кучу строк
- Надо уменьшить размер базы (VACUUM FULL)
- Перед крупными операциями (дампы, миграции)
- Если autovacuum тупит
Кстати, игнорировать VACUUM опасно – Postgres может дойти до ситуации, когда транзакции тупо перестанут работать (XID wraparound). Поэтому на собесах тоже спрашивают нередко.
А ты уже пылесосил свою базу? Напиши про свой опыт в комm



