Gymterview
middle

Зачем нужны VACUUM и AUTOVACUUM?

Из-за MVCC при UPDATE и DELETE старые версии строк не удаляются физически — они помечаются как «мёртвые» (dead tuples). VACUUM — это процесс очистки мёртвых версий строк и возврата освобождённого пространства для повторного использования.

Что делает VACUUM

  1. Помечает пространство от мёртвых строк как доступное для повторного использования (но не возвращает его ОС)
  2. Обновляет карту видимости (visibility map) — ускоряет Index Only Scan
  3. Обновляет карту свободного пространства (free space map)
  4. Предотвращает переполнение счётчика транзакций (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.