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 — локальная установка не требуется.
Все уроки этого курса
- MVCC и причины раздувания
- VACUUM, autovacuum, vacuum_cost_delay
- ANALYZE и pg_statistic
- Сканирование только по индексу и карта видимости