Я пытаюсь заставить PostgreSQL активно пылесосить мою базу данных. В настоящее время я настроил автоматический вакуум следующим образом:
- autovacuum_vacuum_cost_delay = 0 # Отключить вакуум на основе стоимости
- autovacuum_vacuum_cost_limit = 10000 # Максимальное значение
- autovacuum_vacuum_threshold = 50 # Значение по умолчанию
- autovacuum_vacuum_scale_factor = 0.2 # Значение по умолчанию
Я заметил, что автоматический вакуум включается только тогда, когда база данных не загружена, поэтому я попадаю в ситуации, когда мертвых кортежей гораздо больше, чем живых кортежей. Смотрите прикрепленный скриншот для примера. Один из столов имеет 23 живых кортежа, но 16845 мертвых кортежей ожидают вакуума. Это безумие!
Автоматический вакуум включается, когда завершается тестовый прогон и сервер базы данных находится в режиме ожидания, а это не то, чего я хочу, поскольку я хотел бы, чтобы автоматический вакуум включался всякий раз, когда число мертвых кортежей превышает 20% живых кортежей + 50, поскольку база данных была сконфигурировано. Автоматический вакуум, когда сервер бездействует, для меня бесполезен, поскольку ожидается, что рабочий сервер будет работать с 1000-кратными обновлениями в секунду в течение длительного периода времени, поэтому мне нужно, чтобы автоматический вакуум работал даже при нагрузке на сервер.
Есть ли что-то, что я пропускаю? Как заставить автоматический вакуум работать, когда сервер находится под большой нагрузкой?
Обновить
Может ли это быть проблемой блокировки? Рассматриваемые таблицы являются сводными таблицами, которые заполняются с помощью триггера после вставки. Эти таблицы заблокированы в режиме SHARE ROW EXCLUSIVE, чтобы предотвратить одновременную запись в одну и ту же строку.