Зачем нужны VACUUM и AUTOVACUUM?
Из-за MVCC при UPDATE и DELETE старые версии строк не удаляются физически — они помечаются как «мёртвые» (dead tuples). VACUUM — это процесс очистки мёртвых версий строк и возврата освобождённого пространства для повторного использования.
Что делает VACUUM
- Помечает пространство от мёртвых строк как доступное для повторного использования (но не возвращает его ОС)
- Обновляет карту видимости (visibility map) — ускоряет Index Only Scan
- Обновляет карту свободного пространства (free space map)
- Предотвращает переполнение счётчика транзакций (transaction ID wraparound)
Пример
VACUUM transactions; -- ручной VACUUM
VACUUM VERBOSE transactions; -- с подробностями
VACUUM ANALYZE transactions; -- VACUUM + обновление статистики
VACUUM FULL transactions; -- полная перестройка, возвращает место ОС
-- ВНИМАНИЕ: VACUUM FULL блокирует таблицу (ACCESS EXCLUSIVE)!
AUTOVACUUM
AUTOVACUUM — фоновый процесс, который автоматически выполняет VACUUM и ANALYZE.
Формула запуска: dead_tuples > threshold + scale_factor * n_live_tup
Настройка и мониторинг AUTOVACUUM
-- Мониторинг
SELECT
relname, n_dead_tup, n_live_tup,
last_vacuum, last_autovacuum,
last_analyze, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
-- Настройка для конкретной таблицы (горячие таблицы)
ALTER TABLE transactions SET (
autovacuum_vacuum_scale_factor = 0.01, -- 1% вместо 20%
autovacuum_vacuum_threshold = 1000,
autovacuum_analyze_scale_factor = 0.005
);
Transaction ID Wraparound
PostgreSQL использует 32-битный счётчик транзакций (~4 млрд). VACUUM обязан выполняться периодически, чтобы «заморозить» (freeze) старые транзакции и предотвратить переполнение. Если автовакуум не справляется, PostgreSQL может остановить приём новых транзакций для защиты данных.
Пример
-- Проверить возраст самой старой незамороженной транзакции
SELECT datname, age(datfrozenxid) FROM pg_database ORDER BY age DESC;
-- Если age приближается к 2 млрд — критическая ситуация!
Никогда не отключайте AUTOVACUUM! Вместо этого настройте его параметры для конкретных таблиц.
На собеседовании: связка MVCC -> dead tuples -> VACUUM -> wraparound показывает системное понимание PostgreSQL. Ключевые факты: VACUUM не возвращает место ОС (это делает только VACUUM FULL с блокировкой), AUTOVACUUM нельзя отключать из-за риска transaction ID wraparound.