Что такое VACUUM в PostgreSQL и зачем он нужен?

Ответ

VACUUM в PostgreSQL — это служебная команда для "сборки мусора".

Из-за архитектуры MVCC (Multi-Version Concurrency Control), при операциях UPDATE и DELETE старые версии строк не удаляются физически, а лишь помечаются как «мертвые» (dead tuples). VACUUM освобождает место, занятое этими строками, для повторного использования внутри таблицы.

Основные виды и их отличия:

  • VACUUM — стандартная очистка. Не блокирует чтение/запись таблицы. Не возвращает место операционной системе, а делает его доступным для новых строк внутри таблицы.
  • VACUUM FULL — полная очистка. Блокирует таблицу полностью (exclusive lock), физически перезаписывая её без «мертвых» строк и возвращая избыточное место операционной системе. Используется редко и с осторожностью.
  • VACUUM ANALYZE — частый и рекомендуемый вариант. Выполняет VACUUM и затем ANALYZE. Команда ANALYZE собирает статистику о распределении данных в таблице, которая необходима планировщику запросов для построения эффективных планов выполнения.

Автовакуум:

По умолчанию в PostgreSQL включен процесс автовакуума, который автоматически выполняет VACUUM и ANALYZE при достижении определенного порога измененных или удаленных строк. Ручной запуск требуется в исключительных случаях, например, после массовых операций UPDATE или DELETE.