Поток с большим количеством ОБНОВЛЕНИЙ и PostgreSQL

Вы могли бы быть в состоянии использовать CSS 2 @page правило , которое позволяет Вам устанавливать свойство 'размера' к среде .

7
задан Juan Mellado 1 May 2012 в 18:20
поделиться

2 ответа

База данных действительно не лучший инструмент для сбора большого количества небольших обновлений, но поскольку я не знаю ваших запросов и требований ACID, я не могу рекомендовать что-то еще. Если это приемлемый подход, агрегирование обновлений на стороне приложения, предложенное zzzeek, ​​может помочь значительно снизить нагрузку обновлений.

Существует аналогичный подход, который может дать вам надежность и возможность запрашивать более свежие данные с некоторой потерей производительности. Создайте буферную таблицу, которая может собирать изменения значений, которые необходимо обновить, и вставьте туда изменения. Через определенные промежутки времени в транзакции переименовывайте таблицу во что-нибудь другое и создайте новую таблицу вместо нее. Затем в транзакции объедините все изменения, выполните соответствующие обновления в основной таблице и обрежьте буферную таблицу. Таким образом, если вам нужен согласованный и свежий снимок любых данных, вы можете выбрать их из основной таблицы и присоединиться ко всем изменениям из активных и переименованных буферных таблиц.

Однако, если ни один из них не приемлем, вы также можете настроить базу данных для работы с лучше при большой загрузке обновлений.

Чтобы оптимизировать обновление, убедитесь, что PostgreSQL может использовать кортежи только для кучи для хранения обновленных версий строк. Для этого убедитесь, что в часто обновляемых столбцах нет индексов, и измените коэффициент заполнения на что-то меньшее со 100% по умолчанию. Вам нужно будет определить подходящий коэффициент заполнения самостоятельно, поскольку он сильно зависит от деталей рабочей нагрузки и машины, на которой она работает. Коэффициент заполнения должен быть достаточно низким, чтобы все обновления помещались на одной странице базы данных, прежде чем автоочистка сможет очистить старые невидимые версии. Вы можете настроить параметры автоочистки, чтобы найти компромисс между плотностью базы данных и накладными расходами на вакуум. Также примите во внимание, что любые длинные транзакции, включая статистические запросы, будут удерживать кортежи, которые изменились после начала транзакции. См. Представление pg_stat_user_tables , чтобы узнать, что настраивать, особенно взаимосвязь между n_tup_hot_upd и n_tup_upd и n_live_349] n_live_349tup ].

Интенсивное обновление также приведет к большой загрузке журнала упреждающей записи (WAL). Настройка поведения WAL ( документы для настроек ) поможет снизить это. В частности, более высокое число checkpoint_segments и более высокое значение checkpoint_timeout могут значительно снизить нагрузку на ввод-вывод, позволяя выполнять больше обновлений в памяти. Посмотрите взаимосвязь checkpoints_timed и checkpoints_req в pg_stat_bgwriter, чтобы увидеть, сколько контрольных точек происходит из-за достижения любого из пределов. Также поможет увеличить количество shared_buffers, чтобы рабочий набор поместился в памяти. Проверьте buffers_checkpoint и buffers_clean + buffers_backend, чтобы узнать, сколько из них было записано для удовлетворения требований контрольной точки по сравнению с просто нехваткой памяти.

Также поможет увеличить количество shared_buffers, чтобы рабочий набор поместился в памяти. Проверьте buffers_checkpoint и buffers_clean + buffers_backend, чтобы узнать, сколько из них было записано для удовлетворения требований контрольной точки по сравнению с просто нехваткой памяти.

Также поможет увеличить количество shared_buffers, чтобы рабочий набор поместился в памяти. Проверьте buffers_checkpoint и buffers_clean + buffers_backend, чтобы узнать, сколько из них было записано для удовлетворения требований контрольной точки по сравнению с просто нехваткой памяти.

14
ответ дан 6 December 2019 в 09:20
поделиться

Вы хотите собирать статистические обновления по мере их поступления в какую-либо очередь в памяти или, альтернативно, в шину сообщений, если вы более амбициозны. Затем процесс получения агрегирует эти статистические обновления на периодической основе - от каждых 5 секунд до каждого часа - в зависимости от того, что вы хотите. Затем обновляются счетчики bytes_received и bytes_sent , которые могут представлять множество отдельных сообщений «обновления», суммированных вместе. Кроме того, вы должны объединить операторы обновления для нескольких идентификаторов в одну транзакцию, гарантируя, что операторы обновления выдаются в одном относительном порядке относительно первичного ключа, чтобы предотвратить взаимоблокировки других транзакций, которые могут делать то же самое.

Таким образом вы "группируете" действия на более крупные фрагменты, чтобы контролировать, насколько велика нагрузка на базу данных PG, а также сериализовать множество одновременных действий в один поток (или несколько, в зависимости от того, сколько потоков / процессов выдают обновления). Компромисс, который вы настраиваете на основе «периода», заключается в том, насколько актуален и сколько загружено обновление.

6
ответ дан 6 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: