Ответ
VACUUM
в PostgreSQL — это механизм очистки, который освобождает место, занимаемое "мёртвыми" строками (удалёнными или обновлёнными версиями строк). Это необходимо из-за архитектуры MVCC (Multi-Version Concurrency Control), где старые версии строк не удаляются сразу, а остаются до тех пор, пока они не перестанут быть видимыми для активных транзакций.
Основные функции:
- Освобождение места: Помечает место, занимаемое мёртвыми строками, как доступное для повторного использования внутри файла данных таблицы. (Без
VACUUM FULL
или перезаписи таблицы это место не возвращается операционной системе). - Обновление статистики:
VACUUM ANALYZE
собирает статистику о распределении данных в таблицах и индексах, что критично для планировщика запросов для выбора оптимальных планов выполнения. - Защита от «раздувания» (bloat): Предотвращает чрезмерное увеличение размера таблиц и индексов.
- Предотвращение зацикливания Transaction ID (wraparound):
VACUUM
также обновляетrelfrozenxid
для предотвращения переполнения счётчика транзакций, что может привести к остановке базы данных.
Типы VACUUM:
- Обычный (
VACUUM
):- Не блокирует таблицу для чтения и записи (позволяет параллельную работу).
- Помечает место для повторного использования, но не возвращает его операционной системе.
- Часто используется с
ANALYZE
(VACUUM ANALYZE
).
- Полный (
VACUUM FULL
):- Перезаписывает всю таблицу, создавая новую версию без мёртвых строк.
- Возвращает освободившееся место операционной системе (уменьшает размер файла).
- Блокирует таблицу для всех операций (чтение, запись) на время выполнения. Используется редко, только при сильном "раздувании".
Пример:
-- Обычный VACUUM с анализом (фоновый, неблокирующий)
VACUUM ANALYZE users;
-- Полная очистка (блокирует таблицу, возвращает место ОС)
VACUUM FULL users;
Автовакуум (Autovacuum):
Включен по умолчанию и автоматически выполняет VACUUM
и ANALYZE
для таблиц, когда количество мёртвых строк достигает определённого порога. Это рекомендуемый способ поддержания здоровья базы данных.