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% строк

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

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

Ответ 18+ 🔞

Давайте разберёмся, что за зверь такой этот VACUUM и его брат-автомат AUTOVACUUM. А то у нас тут в базе после удалений и обновлений остаётся куча мёртвых строк, как призраки после вечеринки — вроде их нет, а место занимают, сволочи. Это всё из-за многоверсионности, ну вы поняли.

VACUUM — это ручной трудяга

Ты его вызываешь, когда сам решил, что пора прибраться. Он вычищает эти мёртвые строки, освобождает место внутри таблицы, чтобы новые данные могли туда влезть. Ещё может статистику для планировщика обновить, если попросить вежливо.

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

AUTOVACUUM — это автономный уборщик-робот

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

  • Нюансы:
    • Работает тихо, на фоне, не спрашивая. Главный по профилактике.
    • Его можно тонко настраивать — и глобально, и для каждой таблицы отдельно.
-- Говорим таблице users: "Дорогая, давай убираться почаще, когда 5% строк изменится"
ALTER TABLE users SET (autovacuum_vacuum_scale_factor = 0.05);

Так в чём же разница, ёпта?

Критерий VACUUM AUTOVACUUM
Кто запускает Ты, своими руками, когда вспомнишь Сам, как добросовестный робот-пылесос
Зачем нужен Для точечной уборки или срочного разгребания авгиевых конюшен Для постоянной, плановой профилактики, чтобы до авгиевых конюшен не доходило
Блокирует ли Обычный — нет. FULL — да, наглухо, всем пиздец Никогда не использует блокирующий FULL, не идиот же