Ответ
Команда VACUUM в PostgreSQL — это ключевой инструмент для обслуживания базы данных, работа которой тесно связана с её архитектурой MVCC (Multi-Version Concurrency Control).
В PostgreSQL при UPDATE или DELETE старые версии строк (называемые "мертвыми кортежами" или dead tuples) не удаляются физически сразу. Вместо этого они помечаются как невидимые для будущих транзакций. Это и есть суть MVCC, позволяющая разным транзакциям видеть разные "снимки" данных без блокировок на чтение.
Со временем эти мертвые кортежи накапливаются, что приводит к "раздуванию" таблиц и снижению производительности. VACUUM решает эту проблему.
Основные задачи VACUUM:
Освобождение места:
VACUUMнаходит мертвые кортежи и помечает занимаемое ими пространство как доступное для повторного использования новыми строками внутри той же таблицы. Важно: обычныйVACUUMне возвращает место операционной системе.Обновление статистики:
VACUUM(особенно в паре сANALYZE) собирает статистику о распределении данных в таблицах. Эта информация используется планировщиком запросов для построения наиболее эффективных планов выполнения.Предотвращение "обертывания" ID транзакций (Transaction ID Wraparound): Это критически важная фоновая задача.
VACUUMпомечает старые транзакции как "замороженные", чтобы счетчик ID транзакций мог безопасно использоваться повторно, предотвращая остановку базы данных.
Виды VACUUM:
VACUUM: Стандартная, неблокирующая операция. Может выполняться параллельно с чтением и записью в таблицу.VACUUM FULL: Полностью переписывает таблицу в новый файл без мертвых кортежей, возвращая место операционной системе. Эта операция требует эксклюзивной блокировки и может быть очень долгой и ресурсоемкой.VACUUM ANALYZE: ВыполняетVACUUMиANALYZEза один проход.
В большинстве случаев ручной запуск не требуется, так как по умолчанию включен Autovacuum — фоновый процесс, который автоматически выполняет VACUUM и ANALYZE при достижении определенных порогов изменений в таблицах.