У меня есть вопрос относительно настроек автоочистки / очистки Postgres. У меня есть таблица с 4,5 миллиардами строк, и был период времени с большим количеством обновлений, что привело к ~ 1,5 миллиардам мертвых кортежей. В этот момент автовакуумирование занимало много времени (дни). Глядя на представление pg_stat_progress_vacuum, я заметил, что:
max_dead_tuples = 178956970
что приводит к многократному повторному сканированию индекса (index_vacuum_count)
Согласно документам - max_dead_tuples – это количество мертвых кортежей, которые мы можем сохранить до того, как потребуется выполнить цикл очистки индекса, на основе Maintenance_work_mem.
Согласно это один мертвый кортеж требует 6 байтов пространства.
Таким образом, 6B x 178956970 = ~1GB
Но мои настройки
maintenance_work_mem = 20GB
autovacuum_work_mem = -1
Итак, что мне не хватает? почему не все мои 1,5-битные мертвые кортежи поместились в max_dead_tuples, поскольку 20 ГБ должно давать достаточно места, и почему было необходимо несколько прогонов?