Что такое VACUUM в PostgreSQL

Ответ

VACUUM в PostgreSQL — это критически важный процесс обслуживания, предназначенный для управления хранением данных и поддержания производительности базы данных. Он освобождает дисковое пространство, занимаемое "мёртвыми" строками, и обновляет статистику таблиц.

Почему VACUUM необходим? PostgreSQL использует модель многоверсионного управления параллельным доступом (MVCC). При обновлении или удалении строки её старая версия не удаляется немедленно, а помечается как "мёртвая". Эти "мёртвые" строки продолжают занимать дисковое пространство, что приводит к:

  • Раздуванию (bloat) таблиц и индексов, увеличивая их размер на диске.
  • Снижению производительности запросов, так как СУБД приходится сканировать больше данных.
  • Потенциальному исчерпанию идентификаторов транзакций (transaction ID wraparound), что может привести к остановке базы данных.

Основные функции VACUUM:

  • Освобождение места: Помечает пространство, занимаемое "мёртвыми" строками, как доступное для повторного использования новыми данными.
  • Обновление статистики: Собирает и обновляет статистику распределения данных в таблицах, что позволяет планировщику запросов строить более эффективные планы выполнения.
  • Предотвращение wraparound: В режиме VACUUM FREEZE или при обычном VACUUM с определёнными условиями, он "замораживает" старые транзакции, предотвращая проблему исчерпания ID транзакций.

Типы VACUUM:

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

Автоматический VACUUM (Autovacuum): PostgreSQL имеет встроенный фоновый процесс autovacuum, который автоматически запускает VACUUM и ANALYZE для таблиц, когда это необходимо. Это критически важно для поддержания здоровья и производительности базы данных, а также для предотвращения transaction ID wraparound. Ручной запуск VACUUM обычно требуется только в специфических случаях, например, после массовых удалений или обновлений, или для принудительного уменьшения размера таблицы с помощью VACUUM FULL.