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