Демон AUTOVACUUM PostgreSQL
Представленный в PostgreSQL 8.1 демон AUTOVACUUM - это дополнительная функция, которая автоматически пылесосит базу данных, поэтому нет необходимости запускать оператор VACUUM вручную. Демон AUTOVACUUM включен в конфигурации по умолчанию.
Демон AUTOVACUUM состоит из нескольких процессов, которые восстанавливают хранилище, удаляя устаревшие данные или кортежи из БД.
При включенной автоочистке в системе всегда присутствует процесс autovacuum launcher, который занимается планированием работы. Реальную очистку выполняют процессы autovacuum worker, несколько экземпляров которых могут работать параллельно. Процессы autovacuum worker запускаются процессом postmaster по просьбе autovacuum launcher (поскольку именно postmaster отвечает за порождение всех новых процессов).
Новый рабочий процесс запускается несколько раз в autovacuum_naptime для каждой БД (то есть при наличии N баз процессы будут порождаться в N раз чаще). Общее количество рабочих процессов ограничено параметром autovacuum_max_workers.
Условия запуска AUTOVACUUM
Процесс AUTOVACUUM запускается только в том случае, если выполняется хотя бы одно из следующих условий:
- Текущий txid меньше результата следующего выражения:
relfrozenxid+autovacuum_freeze_max_age, где relfrozenxid - значение relfrozenxid целевой таблицы, определенное в pg_class, а autovacuum_freeze_max_age (по умолчанию 200 000 000) - параметр конфигурации.
- Количество “мертвых” кортежей больше, чем результат следующего выражение:
autovacuum_vacuum_threshold+autovacuum_vacuum_scale_factor×reltuples, где autovacuum_vacuum_threshold (по умолчанию 50) и autovacuum_vacuum_scale_factor (по умолчанию 0,2) - параметры конфигурации, а reltuples - количество кортежей в целевой таблице.
Например, если целевая таблица содержит 10 000 кортежей, 2100 из которых – “мертвые” кортежей, запускается процесс AUTOVACUUM, так как 2100>50+0.2×10000.
- Количество добавленных кортежей в целевой таблице больше результата следующего выражения:
autovacuum_vacuum_insert_threshold+autovacuum_vacuum_insert_scale_factor×reltuples, где autovacuum_vacuum_insert_threshold (по умолчанию 1000) и autovacuum_vacuum_insert_scale_factor (по умолчанию 0.2) - параметры конфигурации, а reltuples - количество кортежей в целевой таблице.
Например, если целевая таблица содержит 10 000 кортежей и 3 010 вставленных кортежей, запускается процесс AUTOVACUUM, поскольку 3010>1000+0.2×10000
Данное условие было добавлено в версии 13 и остается актуальным в более поздних версиях.
Примечание: Функция relation_needs_vacanalyze() определяет, нужно ли “пылесосить” или анализировать целевые таблицы
Полезные подсказки
Многим известна особенность PostgreSQL, которая приводит к эффекту раздувания таблиц, или table bloat. Известно что она проявляет себя в случаях интенсивного обновления данных, как при частых UPDATE так и при INSERT/DELETE операциях. В результате такого раздувания значительно снижается производительность.
Если AUTOVACUUM не справляется, например в результате активного изменения большего количества данных или просто из-за плохих настроек, то к таблице будут излишне добавляться новые страницы по мере поступления новых записей. И даже после того как очистка дойдёт до наших удалённых записей, новые страницы все равно останутся. Получается, что таблица становится более разряженной в плане плотности записей. Это и называется эффектом раздувания таблиц, table bloat.
AUTOVACUUM запускается в том случае, если количество “мертвых” кортежей превышает: 250 для 1 000 отношений, 20 050 для 100 000 отношений и 20 000 050 для 100 000 000 отношений. Таким образом, чем больше кортежей в таблице, тем реже запускается AUTOVACUUM.
Одним из полезных советов является уменьшение значения autovacuum_vacuum_scale_factor. На самом деле, его значение, установленное по умолчанию (0,2), слишком велико для больших таблиц.
PostgreSQL может установить релевантное значение autovacuum_vacuum_scale_factor для каждой таблице с помощью команды ALTER TABLE. Например, установить новое значение autovacuum_vacuum_scale_factor для таблицы pgbench_accounts можно следующим образом:
postgres=# ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_scale_factor = 0.05); ALTER TABLE
AUTOVACUUM можно запускать вне зависимости от количества их кортежей таблицы.
Например, предположим, что Вам нужен AUTOVACUUM в том случае, если количество “мертвых” кортежей достигает 10 000. Если Вы зададите следующие параметры хранения для целевой таблицы, процесс Autovacuum будет выполнять вакуумную обработку каждый раз, когда число “мертвых” кортежей достигнет 10 000:
postgres=# ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_threshold = 10000); ALTER TABLE postgres=# ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_scale_factor = 0.0); ALTER TABLE



