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

Ответ 18+ 🔞

А, VACUUM, ёпта, классика! Это ж как генеральная уборка в твоей базе данных, только вместо швабры — магические заклинания SQL.

Смотри, в PostgreSQL есть такая архитектура MVCC — чтобы транзакции друг другу не мешали, каждая видит свой снимок данных. И когда ты что-то обновляешь или удаляешь, старые версии строк не стираются сразу, а остаются как «мёртвые души», блядь. Они просто валяются, место занимают, а пользы — ноль. Вот VACUUM — это такой дворник, который приходит и говорит: «Так, всё, что тут не живёт — на свалку истории, место освобождаем».

Что он, сука, делает:

  • Место расчищает: Помечает пространство от этих мёртвых строк как свободное для новых данных. Но внимание, ёпта! Обычный VACUUM не отдаёт это место обратно операционке — оно просто переиспользуется внутри файла таблицы. Чтобы вернуть системе, нужен VACUUM FULL, но это уже тяжёлая артиллерия.
  • Статистику обновляет: Особенно с ANALYZE. Планировщик запросов — он как капитан корабля, а статистика — его карты. Без свежих карт он запросто может направить твой запрос не в гавань, а на скалы, блядь. VACUUM ANALYZE эти карты вовремя подрисовывает.
  • От раздувания спасает: Если его не запускать, таблицы и индексы начинают пухнуть как на дрожжах — места много, а данных реальных — кот наплакал. Это и есть bloat.
  • От апокалипсиса защищает: Есть там счётчик ID транзакций. Если он переполнится (wraparound), база просто встанет колом, пипец. VACUUM вовремя обнуляет этот счётчик для старых данных, не давая случиться пиздецу.

А теперь виды уборки:

  • Обычная уборка (VACUUM):

    • Как будто ты пылесосишь, пока все дома. Никого не выгоняешь, работа кипит.
    • Место внутри комнаты расчистил, но мусорный мешок за дверь не вынес.
    • Часто идёт в паре с ANALYZE — «пылесосить и пересчитывать вилки в шкафу».
  • Генеральная с ремонтом (VACUUM FULL):

    • Это когда ты всех выгоняешь из квартиры, выносишь всю мебель, делаешь евроремонт и заносишь обратно только нужное.
    • Место системе возвращается, всё компактно. НО! На время ремонта в квартире (таблице) находиться нельзя вообще никому — полная блокировка. Используй только в крайних случаях, когда обычный уборщик уже не справляется.

Примеры, чтобы не быть мудаком:

-- Лёгкая ежедневная уборка (не мешает жильцам)
VACUUM ANALYZE users;

-- Полный разгром квартиры с выносом стен (всем стоять снаружи и ждать!)
VACUUM FULL orders;

АВТОВАКУУМ (Autovacuum): Это главное, блядь! Включён по умолчанию. Это как робот-пылесос, который сам ездит и прибирается, когда видит, что накопилось определённое количество мусора (мёртвых строк). Забудь про ручной VACUUM для повседневки — пусть робот работает. Это и есть правильный, здоровый путь.