Извлечение и обновление большого объема данных в postgresql

#sql #node.js #database #postgresql #batch-processing

#sql #node.js #База данных #postgresql #пакетная обработка

Вопрос:

Я создаю веб-приложение и использую PostgreSQL в качестве базы данных. Мне нужно извлекать и обновлять тысячи строк каждые 5-10 минут. Допустим, у меня в таблице 1 МЛН строк со следующей схемой:

 ServiceStatus {
 id: string,
 userid: string,
 status: string,
}
 

Я буду извлекать все строки на основе состояния сервиса (предположим, 100 000 строк каждые 5 минут), и на основе статуса я выполню некоторую обработку и обновлю статус в БД. Как я уже сказал, я буду делать это каждые 5-10 минут. Какой наиболее эффективный подход к этому?

Комментарии:

1. Есть ли status на нем индекс? Приведите пример запроса, который вы собираетесь выполнить. Каждый status из них охватывает 100 000 строк или вы собираетесь извлекать несколько status значений?

2. статус может быть активным или ожидающим. Я буду извлекать все ожидающие servicestatus. (Извлечение всех данных из таблицы servicestatus). Например, допустим, у нас есть 10 строк, из которых 6 находятся в ожидании, а 4 активны, в этом случае я хочу получить все 6 строк и выполнить некоторую обработку, а затем обновить статус на основе результата. Это не так сложно, мы можем просто использовать операторы select и where для фильтрации данных, извлечения всех значений и их обновления, но проблема в том, что мы делаем это в больших масштабах и чаще, и для этого требуется некоторая оптимизация.

3. Итак, вы действительно видите замедление? Если да, то результаты EXPLAIN ANALYZE для запроса были бы полезны?

4. Может ли «некоторая обработка» выполняться в базе данных или это должно выполняться снаружи?

5. @jjanes снаружи я буду использовать идентификатор статуса для взаимодействия с внешним API и получения последнего статуса.

Ответ №1:

Выборка 100 000 строк один раз в 5 минут не будет утомительной. Их обновление также не должно быть, но, вероятно, не обновляйте его, просто чтобы вернуть ему то же значение, которое оно уже имеет.

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