Демон AUTOVACUUM состоит из нескольких процессов, которые восстанавливают хранилище, удаляя устаревшие данные или кортежи из базы данных. Он проверяет таблицы, в которых имеется значительное количество вставленных, обновленных или удаленных записей, и пылесосит эти таблицы на основе параметров конфигурации
. Вы можете определить, требуется ли очистка таблицы в вашей базе данных с помощью запустив следующий запрос:
ВЫБЕРИТЕ имя данных, возраст (datfrozenxid) ОТ базы данных pg ORDER BY age (datfrozenxid) des c limit 20;
Пока вы подключены к Ваша база данных, выполнив следующий запрос, поможет увидеть список таблиц, которые автоочистка считает пригодными для очистки:
WITH vbt AS (SELECT setting AS autovacuum_vacuum_threshold FROM
pg_settings WHERE name = 'autovacuum_vacuum_threshold')
, vsf AS (SELECT setting AS autovacuum_vacuum_scale_factor FROM
pg_settings WHERE name = 'autovacuum_vacuum_scale_factor')
, fma AS (SELECT setting AS autovacuum_freeze_max_age FROM
pg_settings WHERE name = 'autovacuum_freeze_max_age')
, sto AS (select opt_oid, split_part(setting, '=', 1) as param,
split_part(setting, '=', 2) as value from (select oid opt_oid,
unnest(reloptions) setting from pg_class) opt)
SELECT
'"'||ns.nspname||'"."'||c.relname||'"' as relation
, pg_size_pretty(pg_table_size(c.oid)) as table_size
, age(relfrozenxid) as xid_age
, coalesce(cfma.value::float, autovacuum_freeze_max_age::float)
autovacuum_freeze_max_age
, (coalesce(cvbt.value::float, autovacuum_vacuum_threshold::float)
+ coalesce(cvsf.value::float,autovacuum_vacuum_scale_factor::float) *
c.reltuples) as autovacuum_vacuum_tuples
, n_dead_tup as dead_tuples
FROM pg_class c join pg_namespace ns on ns.oid = c.relnamespace
join pg_stat_all_tables stat on stat.relid = c.oid
join vbt on (1=1) join vsf on (1=1) join fma on (1=1)
left join sto cvbt on cvbt.param = 'autovacuum_vacuum_threshold' and
c.oid = cvbt.opt_oid
left join sto cvsf on cvsf.param = 'autovacuum_vacuum_scale_factor' and
c.oid = cvsf.opt_oid
left join sto cfma on cfma.param = 'autovacuum_freeze_max_age' and
c.oid = cfma.opt_oid
WHERE c.relkind = 'r' and nspname <> 'pg_catalog'
and (
age(relfrozenxid) >= coalesce(cfma.value::float,
autovacuum_freeze_max_age::float)
or
coalesce(cvbt.value::float, autovacuum_vacuum_threshold::float) +
coalesce(cvsf.value::float,autovacuum_vacuum_scale_factor::float) *
c.reltuples <= n_dead_tup
-- or 1 = 1
)
ORDER BY age(relfrozenxid) DESC LIMIT 50;
Некоторые параметры влияют на поведение автоочистки и выполняют следующий запрос. показывает значения некоторых параметров, которые непосредственно влияют на автовакуум и его поведение:
SELECT name, setting, unit, short_desc
FROM pg_settings
WHERE name IN (
'autovacuum_max_workers',
'autovacuum_analyze_scale_factor',
'autovacuum_naptime',
'autovacuum_analyze_threshold',
'autovacuum_analyze_scale_factor',
'autovacuum_vacuum_threshold',
'autovacuum_vacuum_scale_factor',
'autovacuum_vacuum_threshold',
'autovacuum_vacuum_cost_delay',
'autovacuum_vacuum_cost_limit',
'vacuum_cost_limit',
'autovacuum_freeze_max_age',
'maintenance_work_mem',
'vacuum_freeze_min_age');
Хотя все они влияют на автовакуум, некоторые из наиболее важных из них:
maintenance_mork_mem
autovacuum_freeze_max_age
autovacuum_max_workers
autovacuum_vacuum_cost_delay
Autovacuum_vacuum_cost_limit
Ниже приведено определение / объяснение некоторых из этих важных параметров:
Autovacuum_freeze_max_age Spec ifies максимальный возраст (в транзакциях), которого может достичь поле pg_class.relfrozenxid таблицы, прежде чем операция VACUUM будет вынуждена предотвратить обход идентификатора транзакции в таблице. Обратите внимание, что система будет запускать процессы автоочистки, чтобы предотвратить циклическое изменение, даже если автовакуум отключен.
autovacuum_max_workers (integer) Этот параметр указывает максимальное количество процессов автоочистки, которые могут выполняться в любой момент времени, поскольку очистка не происходят в одном процессе автовакуума. По умолчанию используется три (3).
autovacuum_vacuum_cost_limit Этот параметр указывает предельное значение стоимости, которое будет использоваться в автоматических операциях c VACUUM. Если указано значение -1 (которое используется по умолчанию), будет использоваться обычное значениеuum_cost_limit. Обратите внимание, что это значение распределяется пропорционально между работающими работниками автоочистки, если их больше одного, так что сумма пределов для каждого работника не превышает значения этой переменной.
autovacuum_vacuum_cost_delay Этот параметр указывает значение задержки стоимости, которое будет использоваться в автоматических c операциях VACUUM. Если указано -1, будет использоваться обычное значение вакуума_коста. Значение по умолчанию составляет 20 миллисекунд.
autovacuum_vacuum_scale_factor Этот параметр указывает, как часто срабатывает автовакуум. Если вы хотите, чтобы автоочистка запускалась чаще, я рекомендую использовать небольшое значение для autovacuum_vacuum_scale_factor (например, 0,02 или 0,01). Чем меньше значение этого параметра, тем меньше число мертвых кортежей, с которыми каждый раз будет работать автоочистка. Для больших таблиц это означает, что для автоматического вакуума может потребоваться меньше времени на ввод-вывод и меньше времени для завершения sh.
Примечание. Для небольших столов может возникнуть проблема, связанная с тем, что автоматический вакуум запускается излишне часто и приводит к накладным расходам. Если ваши таблицы имеют разные размеры или разные шаблоны записи, я рекомендую установить для этого параметра разные значения на уровне таблицы, а не одно значение на уровне базы данных. Для более подробного определения параметров автовакуума, пожалуйста, просмотрите этот документ [2]
[1] Автовакуумная настройка - https://www.2ndquadrant.com/en/blog/autovacuum-tuning-basics/ [2] Дальнейшее определение опции автовакуума - https://www.postgresql.org/docs/9.6/runtime-config-autovacuum.html#GUC - автовакуумный-MAX-РАБОТНИКИ