Ответ
Команда 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
при достижении определенных порогов изменений в таблицах.