Перейти к основному содержимому

Настройки и правила перекрытия параметров

Внимание!

Параметры сервера maintenance_work_mem и autovacuum_work_mem очень важны для очистки. От них напрямую зависит количество циклов операции очистки при большом объеме модификаций таблицы.

В Pangolin при установке автоматически применяются значения:

  • maintenance_work_mem = (Объем физической памяти сервера)/48;
  • autovacuum_work_mem = (Объем физической памяти сервера)/24.

Параметры одиночной команды VACUUM имеют контекст user. Это означает, что они без перезапуска могут быть настроены на уровне сервера, базы, роли, сессии. Прав суперпользователя не требуется. Параметры описаны в разделах стандартной документации:

Если переустанавливать параметры сессии командой SET, то изменения будут сразу использованы в следующих командах VACUUM той же сессии.

Параметры автоматической очистки описаны в разделе «20.10. Автоматическая очистка» документации PostgreSQL. Они имеют контекст postmaster или sighup. Для перенастройки требуются права АБД. Применение нового значения потребует, в зависимости от контекста, перезапуска сервера или pg_reload_conf().

Большинство параметров автоочистки может быть перекрыто на уровне таблицы, а параметр уровня таблицы может быть перекрыт на уровне ее TOAST-таблицы. Для сохранения настроек уровня таблиц используются параметры хранения, которые настраиваются по команде ALTER TABLE .. SET (параметр = значение). Потребуются права владельца таблицы или суперпользователя. Список перекрывающих параметров есть в документации, раздел Параметры хранения описания CREATE TABLE.

Правила перекрытия параметров автоочистки:

Параметр автоочисткиПараметр таблицыПараметр TOASTПримечания
autovacuumautovacuum_enabledtoast.autovacuum_enabledПринудительная заморозка для предотвращения зацикливания выполняется всегда
autovacuum_vacuum_thresholdДаДа
autovacuum_vacuum_scale_factorДаДа
autovacuum_vacuum_insert_thresholdДаДа-1 в параметрах таблицы или TOAST отключает очистку при накоплении INSERT
autovacuum_vacuum_insert_scale_factorДаДа
autovacuum_analyze_thresholdДаНет
autovacuum_analyze_scale_factorДаНет
autovacuum_vacuum_cost_delayДаДа
autovacuum_vacuum_cost_limitДаДа
vacuum_freeze_min_ageautovacuum_freeze_min_agetoast.autovacuum_freeze_min_ageПорог: 1/2 системного autovacuum_freeze_max_age
autovacuum_freeze_max_ageДаДаПорог: системный autovacuum_freeze_max_age
vacuum_freeze_table_ageautovacuum_freeze_table_agetoast.autovacuum_freeze_table_age
vacuum_multixact_freeze_min_ageautovacuum_multixact_freeze_min_agetoast.autovacuum_multixact_freeze_min_ageПорог: 1/2 системного autovacuum_multixact_freeze_max_age
autovacuum_multixact_freeze_max_ageДаДаПорог: системный autovacuum_multixact_freeze_max_age
vacuum_multixact_freeze_table_ageautovacuum_multixact_freeze_table_agetoast.autovacuum_multixact_freeze_table_age
log_autovacuum_min_durationДаДа
autovacuum_max_workersНетНет
autovacuum_naptimeНетНет
autovacuum_work_memНетНет
vacuum_defer_cleanup_ageНетНет
vacuum_cleanup_index_scale_factorНетНетУстаревший параметр, в Pangolin недействителен.

«Да» в ячейке означает, что параметр для таблицы называется так же, как параметр autovacuum, а для TOAST-таблицы – toast.<параметр>. «Нет» – параметр не может быть перекрыт. Иначе явно указано название параметра.

Например, системный параметр autovacuum_vacuum_threshold может быть настроен с перекрытием на уровне таблицы и TOAST-таблицы вот так:

First_db=# ALTER TABLE sch1.table1 SET ( autovacuum_vacuum_threshold = 150, toast.autovacuum_vacuum_threshold = 25 );
ALTER TABLE

Просмотр настройки параметров таблицы:

First_db=# select relnamespace::regnamespace, relname, reloptions from pg_class
where oid in ( 'sch1.table1'::regclass,
( select reltoastrelid from pg_class where oid = 'sch1.table1'::regclass::oid )
);
relnamespace | relname | reloptions
-------------+----------------+-----------------------------------
sch1 | table1 | {autovacuum_vacuum_threshold=150}
pg_toast | pg_toast_23080 | {autovacuum_vacuum_threshold=25}
(2 rows)
First_db=# \d+ sch1.table1
Table "sch1.table1"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
-------+---------+-----------+----------+---------+----------+--------------+-------------
f1 | integer | | | | plain | |
f2 | text | | | | extended | |
Indexes:
"table1_index_f1" UNIQUE, btree (f1)
Access method: heap
Options: autovacuum_vacuum_threshold=150, toast.autovacuum_vacuum_threshold=25

Два параметра таблицы, vacuum_index_cleanup и vacuum_truncate, позволяют выключить для таблицы необязательные блоки алгоритма VACUUM - очистку индексов и усечение файла таблицы на последний занятый блок. По умолчанию – на новой таблице – оба параметра установлены и оба действия разрешены.

Таблица по умолчаниюTOAST-таблица по умолчаниюПримечаниеКлюч VACUUM для перекрытия
vacuum_index_cleanup truetoast.vacuum_index_cleanup trueВыключение имеет смысл при большом объеме/кол-ве индексов.INDEX_CLEANUP
vacuum_truncate truetoast.vacuum_truncate trueВыключение имеет смысл при очень высокой конкуренции в нагрузке, чтобы исключить блокировку AccessExclusiveLock при усечении файла отношения.TRUNCATE

Если необязательные операции для части таблиц выключены, то команда VACUUM с ключами позволяет проигнорировать тонкие настройки и принудительно выполнить операции. К примеру, во время окна обслуживания или пониженной нагрузки.

Просмотр параметров хранения на уровне таблиц:

First_db=# SELECT relnamespace::regnamespace, relname, reloptions FROM pg_class WHERE reloptions is not null;
relnamespace | relname | reloptions
-------------+------------------+-----------------------------------
pg_catalog | pg_stats | {security_barrier=true}
pg_catalog | pg_stats_ext | {security_barrier=true}
sch1 | table1 | {autovacuum_vacuum_threshold=150}
public | pgbench_accounts | {fillfactor=100}
public | pgbench_branches | {fillfactor=100}
public | pgbench_tellers | {fillfactor=100}
pg_toast | pg_toast_23080 | {autovacuum_vacuum_threshold=25}
(7 rows)