Ответ
AutoVacuum — это фоновый демонический процесс в PostgreSQL, который автоматически выполняет операции VACUUM и ANALYZE для поддержания здоровья и производительности базы данных.
Зачем это нужно? В PostgreSQL механизм MVCC (Multiversion Concurrency Control) при UPDATE или DELETE не удаляет старые версии строк физически, а помечает их как «мертвые». Со временем эти «мертвые» кортежи (dead tuples) накапливаются, приводя к:
- Разбуханию таблиц (Bloat): Таблицы и индексы занимают больше места на диске, чем нужно.
- Снижению производительности: Запросы начинают сканировать много неактуальных данных, замедляясь.
- Риску остановки транзакций: Если долгоживущая транзакция мешает очистке очень старых версий строк, может возникнуть ошибка "прерывание из-за заморозки" (wraparound).
Как работает AutoVacuum?
Он периодически проверяет таблицы. Если количество «мертвых» кортежей в таблице превышает порог, рассчитываемый по формуле:
autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor * число_кортежей
— процесс запускает VACUUM для этой таблицы, чтобы:
- Освободить место, помеченное «мертвыми» кортежами, для повторного использования (хотя не всегда возвращает его ОС).
- Обновить статистику, используемую планировщиком запросов (при срабатывании
ANALYZE). - Защитить от wraparound, «замораживая» старые идентификаторы транзакций.
Базовая настройка (postgresql.conf):
autovacuum = on # Включено по умолчанию в современных версиях
track_counts = on # Необходимо для сбора статистики
# Настройки для конкретной таблицы можно переопределить
# ALTER TABLE my_table SET (autovacuum_vacuum_scale_factor = 0.05);
Когда может потребоваться ручное управление или тонкая настройка?
- На таблицах с очень интенсивной нагрузкой на запись, где AutoVacuum не успевает.
- Для больших пакетных операций (например, массовое удаление) — стоит запустить
VACUUMсразу после них. - Для критически важных таблиц, где нужно уменьшить масштабный фактор (
autovacuum_vacuum_scale_factor), чтобы очистка запускалась чаще.