0Pricing
SQL Academy · Урок

VACUUM, autovacuum, vacuum_cost_delay

Настройте пороги autovacuum, vacuum_cost_delay и параллельный VACUUM для больших таблиц

«VACUUM, autovacuum, vacuum_cost_delay» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Три режима VACUUM

  • VACUUM (ленивый) — освобождает мёртвые строки, обновляет карту свободного пространства, не устанавливает исключительную блокировку
  • VACUUM FULL — переписывает таблицу; устанавливает исключительную блокировку; возвращает место на диске операционной системе
  • VACUUM ANALYZE — за один запуск выполняет очистку и обновляет статистику планировщика

Ручной запуск VACUUM

Иногда это полезно даже при включённом автовакууме:

VACUUM (VERBOSE) orders;
VACUUM (VERBOSE, ANALYZE) orders;
VACUUM (PARALLEL 4) orders;       -- parallel index cleanup (PG 13+)

Процесс автовакуума

Фоновый процесс запускает рабочие процессы, которые очищают таблицы, превысившие заданные пороги. По умолчанию несколько рабочих процессов обслуживают кластер.

Настройка отдельных таблиц

Активно изменяемым таблицам помогает агрессивный автовакуум:

ALTER TABLE busy_table SET (
  autovacuum_vacuum_scale_factor = 0.05,    -- 5% dead vs default 20%
  autovacuum_vacuum_threshold    = 1000,
  autovacuum_analyze_scale_factor = 0.05
);

vacuum_cost_delay

Ограничивает ввод-вывод VACUUM, чтобы он не замедлял пользовательские запросы. Значение по умолчанию в PG 12 и более новых версиях — 2 мс, обычно этого достаточно. Для SSD его можно уменьшить:

autovacuum_vacuum_cost_delay = 2ms
-- Lower delay = faster vacuum, more I/O usage.
-- Set per-table for hot tables that need faster cleanup.

Параллельная очистка

Начиная с PG 13, VACUUM выполняет очистку индексов параллельно:

VACUUM (PARALLEL 4) big_table;
-- Each index cleaned by a parallel worker (up to max_parallel_maintenance_workers).

VACUUM FULL: когда и зачем

Полностью переписывает таблицу — возвращает место операционной системе. Устанавливает ACCESS EXCLUSIVE. Используйте этот режим только в крайнем случае или вместо него применяйте pg_repack.

VACUUM FULL orders;
-- Locks orders; rewrites; on huge tables this is hours of downtime.

pg_repack: альтернатива без простоя

Переписывает таблицу в рабочем режиме — без полной блокировки. Даёт тот же эффект, что и VACUUM FULL, но подходит для рабочей среды:

pg_repack -d mydb -t orders
-- Builds a shadow table, sync, swaps in.

Мониторинг автовакуума

Просматривайте время последнего запуска очистки и анализа, а также количество мёртвых строк:

SELECT relname,
       n_live_tup, n_dead_tup,
       last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;

Когда автовакуум не успевает

Симптомы:

  • Раздувание увеличивается
  • Высокое значение n_dead_tup в pg_stat_user_tables
  • Планы запросов ухудшаются

Решения: увеличьте autovacuum_max_workers, уменьшите коэффициент масштабирования для отдельных таблиц, исправьте длительные транзакции, блокирующие очистку.

Журналирование очистки

Для настройки параметров записывайте в журнал медленные операции очистки:

log_autovacuum_min_duration = '500ms'
-- Logs every autovacuum action that took longer than 500ms.

FREEZE

VACUUM время от времени «замораживает» старые кортежи, чтобы предотвратить переполнение идентификаторов транзакций. Агрессивный автовакуум поддерживает небольшой возраст заморозки и предотвращает аварийные события, связанные с переполнением.

Итоги

Автовакуум необходим; настраивайте его с учётом рабочей нагрузки.

  • Настройки автовакуума для отдельных активно изменяемых таблиц
  • VACUUM FULL — крайняя мера, предпочитайте pg_repack
  • Следите за n_dead_tup и last_autovacuum
  • Исправляйте длительные транзакции, блокирующие очистку

Быстрая проверка

Как безопаснее всего освободить место на диске в активно используемой рабочей таблице, не устанавливая длительную блокирующую блокировку?

Часто задаваемые вопросы

Урок «VACUUM, autovacuum, vacuum_cost_delay» бесплатный?

Да — полный текст урока «VACUUM, autovacuum, vacuum_cost_delay» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «VACUUM, autovacuum, vacuum_cost_delay»?

Настройте пороги autovacuum, vacuum_cost_delay и параллельный VACUUM для больших таблиц Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «VACUUM, autovacuum, vacuum_cost_delay»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. MVCC и причины раздувания
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE и pg_statistic
  4. Сканирование только по индексу и карта видимости
← Назад к SQL Academy