У меня есть таблица db, в которой около 5-6 миллионов записей, и для очистки требуется около 20 минут. Поскольку одно поле этой таблицы обновляется очень часто, приходится иметь дело с большим количеством мертвых строк.
Для оценки, с нашей текущей пользовательской базой ежедневно может быть 2 миллиона мертвых кортежей. Итак, очистка этой таблицы требует:
- Чтение ввода-вывода: поскольку вся таблица отсутствует в общей памяти.
- Напишите IO: так как есть много записей для обновления.
Каким должен быть идеальный способ пропылесосить этот стол? Должен ли я увеличить autovacuum_cost_limit
, чтобы разрешить больше операций за один запуск автоочистки? Но, как я вижу, это увеличит IOPS
, что опять же может снизить производительность. В настоящее время у меня есть autovacuum_scale_factor = 0.2
. Должен ли я уменьшить его? Если я уменьшу его, он будет запускаться чаще, хотя количество операций ввода-вывода уменьшится, но это приведет к большему количеству периодов времени с высокой скоростью чтения.
Кроме того, по мере увеличения пользовательской базы это будет занимать все больше и больше времени, так как размер таблицы с увеличением и вакуумом должен будет много считывать с диска. И что же мне делать?
Одно из решений, о которых я подумал:
- Выделите сильно обновленную колонку и сделайте отдельную таблицу.
- Настройка параметра, чтобы он запускался чаще, чтобы уменьшить количество операций записи (как обсуждалось выше). Как справиться с дополнительным чтением ввода-вывода, так как вакуум теперь будет запускаться чаще?
- Объедините пункт 2 вместе с увеличением оперативной памяти, чтобы также уменьшить количество операций чтения.
В общем, какой подход используют люди, потому что я предполагаю, что у людей должна быть очень большая таблица размером 10 ГБ или более, которую необходимо очистить.