PostgreSQL: в чем разница между VACUUM и AUTOVACUUM?

Ответ

Оба механизма служат для очистки базы данных от "мёртвых" строк (tuples), которые остаются после операций DELETE и UPDATE из-за реализации механизма многоверсионности (MVCC) в PostgreSQL.

VACUUM

Это ручная команда для обслуживания таблиц. Она освобождает место, занятое мёртвыми строками, делая его доступным для новых данных. Также VACUUM может обновлять статистику для планировщика запросов (если вызвана с опцией ANALYZE).

  • Особенности:
    • VACUUM: Не блокирует чтение и запись в таблицу, но не возвращает место операционной системе.
    • VACUUM FULL: Блокирует таблицу, переписывает её в новый файл и возвращает место ОС. Используется редко из-за сильного влияния на производительность.
-- Очистка и сбор статистики для таблицы users
VACUUM ANALYZE users;

AUTOVACUUM

Это автоматический фоновый процесс (демон), который периодически выполняет VACUUM и ANALYZE для таблиц, в которых произошло значительное количество изменений.

  • Особенности:
    • Работает автономно, предотвращая "раздувание" таблиц и поддерживая актуальность статистики.
    • Его поведение гибко настраивается через postgresql.conf или параметры конкретной таблицы.
-- Пример настройки для таблицы: запускать autovacuum чаще
ALTER TABLE users SET (autovacuum_vacuum_scale_factor = 0.05); -- при изменении 5% строк

Ключевые отличия

ПараметрVACUUMAUTOVACUUM
ЗапускРучной, по команде администратораАвтоматический, фоновый процесс
НазначениеТочечное обслуживание, экстренная очисткаРегулярная профилактика и поддержка БД
БлокировкиСтандартный VACUUM не блокирует, VACUUM FULL блокируетНикогда не использует блокирующие операции (FULL)