Alexander Nikitin
Коллеги, проясните пож-ста маханизм работы вакуума (теорию я вроде бы знаю, но что-то видимо упустил). Смотрите - есть довольно большая таблица - 240 Гб данных и 800 Гб индексов. Таблица не партиционирована. По ней запустили Vacuum analyze. Сейчас фаза vacuuming indexes, при этом он пошёл уже по второму кругу, но на этот раз время обработки намного больше: если во время первой итерации обработка конкретного индекса занимала 224 секунды, то во время второй итерации время составило уже 3315 сек. Maintenance_work_mem=4Gb. В документации нашёл следующее - Очистка индексов — VACUUM в настоящее время очищает индексы. Если у таблицы есть какие-либо индексы, эта фаза будет наблюдаться минимум единожды в процессе очистки, после того, как куча будет просканирована полностью. Она может повторяться несколько раз в процессе очистки, если объёма maintenance_work_mem оказывается недостаточно для сохранения всех найденных «мёртвых» кортежей. Вопросов два - если увеличить этот размер, скажем до 6Gb, будет ли ускорение? И почему настолько разная скорость обработки индекса?
у вакуума есть рабочая память ( autovacuum_work_mem
или же maintenance_work_mem
, если первая -1
). он сканирует таблицу, помещая “мертвые” записи в память. как только память заканчивается, он переходит в вакуумированию индексов, затем он вакуумирует таблицу (в том диапазоне, что прочитал на первом шаге). затем продолжает сканировать таблицу. соответственно, ему надо:
- дать больше памяти (на таблицах схожих с вашими это 1GB)
- понизить autovacuum_vacuum_cost_delay
, чтобы быстрее работал за счёт более интенсивного IO (если диски не тянут, то будет больно)
можно смотреть прогресс в pg_stat_progress_vacuum