Как работает VACUUM в PostgreSQL

Ответ

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 для таблиц, когда количество мёртвых строк достигает определённого порога. Это рекомендуемый способ поддержания здоровья базы данных.