Я намагаюсь отримати 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, щоб запобігти одночасному запису в один рядок.