← Назад к вопросам

Что такое вакку в бд?

1.0 Junior🔥 201 комментариев
#Базы данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое VACUUM в базах данных?

VACUUM — это критически важная операция обслуживания в реляционных базах данных, прежде всего ассоциирующаяся с PostgreSQL. Она решает две ключевые задачи: возврат неиспользуемого дискового пространства операционной системе и "заморозка" устаревших версий строк для предотвращения проблем с переполнением идентификаторов транзакций (TXID).

Чтобы понять суть VACUUM, нужно сначала разобраться в механизме MVCC (Multi-Version Concurrency Control — Многовариантное управление параллелизмом), который используется в PostgreSQL и других СУБД (например, Oracle, MySQL с InnoDB в определённом виде).

Как работает MVCC и почему нужен VACUUM?

При изменении или удалении строки в таблице PostgreSQL не удаляет и не перезаписывает её физически сразу. Вместо этого создаётся новая версия строки, а старая помечается как неактуальная. Это позволяет другим транзакциям, начавшимся раньше, по-прежнему "видеть" старые данные, обеспечивая изоляцию и параллелизм без блокировок на чтение.

Рассмотрим на примере:

-- Предположим, у нас есть таблица и начальное состояние
CREATE TABLE users (id SERIAL, name TEXT);
INSERT INTO users (name) VALUES ('Alice'); -- TXID 100

-- Транзакция 1 начинает работу.
BEGIN; -- Транзакция получает, условно, ID 200

-- Тем временем в Транзакции 2 (с TXID 201) мы обновляем строку
UPDATE users SET name = 'Bob' WHERE id = 1;
-- На диске теперь ДВЕ версии строки:
-- Версия 1: name='Alice', создана TXID 100, "устарела" для TXID > 201
-- Версия 2: name='Bob', создана TXID 201, актуальна

Старые, "мёртвые" версии строк (dead tuples) накапливаются. Они не видны в обычных запросах, но занимают место на диске, замедляя работу из-за того, что операторам (например, SELECT) приходится сканировать больше данных. Это явление называется блоатом (bloat).

Виды и задачи VACUUM

Обычный VACUUM (не FULL):

  1. Освобождает пространство внутри таблицы и индексов, помечая его как доступное для будущих INSERT и UPDATE этой же таблицы, но не возвращает пространство ОС (за редкими исключениями в конце файла).
  2. Обновляет статистику (Visibility Map), что помогает ускорить работу индексов.
  3. "Замораживает" старые транзакции. Каждой транзакции в PostgreSQL присваивается уникальный номер (TXID). Их количество конечно (≈ 4 млрд). VACUUM помечает очень старые строки как "замороженные" (FROZEN), что предотвращает "завёртывание" (wraparound) — катастрофическую ситуацию, когда из-за переполнения счётчика старые данные внезапно становятся "будущими".
-- Запуск обычного VACUUM. Он не блокирует таблицу для чтения/записи.
VACUUM users;

-- Можно анализировать состояние с помощью специальных представлений
SELECT schemaname, relname, n_dead_tup, last_vacuum
FROM pg_stat_user_tables WHERE relname = 'users';

VACUUM FULL — это гораздо более тяжёлая операция:

  1. Он фактически создаёт новую копию таблицы, оставляя только актуальные строки.
  2. Возвращает освобождённое пространство операционной системе.
  3. Требует эксклюзивной блокировки таблицы на всё время работы, делая её недоступной для записи, а часто и для чтения.
  4. Рекомендуется использовать только в случаях сильного блоата, когда обычный VACUUM не помогает.
-- Используйте с большой осторожностью! Блокирует таблицу.
VACUUM FULL users;

Автоматизация и best practices

Начиная с версии 8.3, PostgreSQL включает автовакуум (autovacuum) — фоновый процесс, который автоматически запускает VACUUM для таблиц с большим количеством "мёртвых" строк. Он критически важен для работоспособности любой production-системы. Его можно тонко настраивать:

-- Настройки autovacuum для конкретной таблицы (пример)
ALTER TABLE users SET (
    autovacuum_vacuum_scale_factor = 0.05, -- Запуск при 5% мёртвых строк
    autovacuum_vacuum_threshold = 1000,
    autovacuum_analyze_scale_factor = 0.02
);

Когда запускать VACUUM вручную?

  • После крупных однократных удалений или обновлений большого процента данных в таблице.
  • Перед выполнением VACUUM FULL или CLUSTER.
  • В определённых случаях для принудительной "заморозки" перед длительным периодом простоя.

Связь с командой ANALYZE: Часто VACUUM запускают вместе с ANALYZE, который обновляет статистику о распределении данных в таблице для планировщика запросов.

VACUUM ANALYZE users; -- Выполняет обе операции

Вывод

VACUUM — это не просто "очистка мусора", а жизненно важный механизм обслуживания внутренних структур данных PostgreSQL, порождённый необходимостью реализации MVCC. Без него (или без autovacuum) база данных постепенно деградирует: растёт потребление диска, падает производительность, и в конечном счёте возникает риск остановки из-за переполнения счётчика транзакций. Понимание принципов его работы — обязательная компетенция для разработчика и администратора PostgreSQL. В других СУБД (как, например, SQLite) также существует команда VACUUM, но её реализация и внутренние причины могут отличаться.

Что такое вакку в бд? | PrepBro