2017-02-13 5 views
0

Основная используемая таблица - transaction и может хранить миллионы строк (скажем, 4-5 миллионов макс.). Мне нужно обновить статус как можно быстрее.Обновление большого количества данных postgresql

Обновление запроса выглядит следующим образом:

UPDATE transaction SET transaction.status = 'TO_EXECUTE' 
WHERE transaction.id IN (SELECT transaction.id FROM transaction 
JOIN anotherTable ON transaction.id = anotherTable.id 
JOIN anotherTable2 ON transaction.serviceId = ontherTable2.id 
WHERE transaction.status = :filter1, transaction.filter2 = :filter2, ...) 

У вас есть лучшее решение? Может ли быть лучше создать другую таблицу для хранения статуса id? (Я красный, что updating large Tables может быть очень медленным).

+0

Люди получают b..i..i ..i..g зарплаты для решения таких вопросов, как вы «Как развивать быстрый веб-сервис ...», и вы хотите получить ответ на такой широкий вопрос здесь? – Andremoniy

+0

Ты прав Андремоний, я отредактировал вопрос, чтобы быть более конкретным. – Fab

ответ

1

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

UPDATE transaction tx SET transaction.status = 'TO_EXECUTE' 
WHERE exists (SELECT * 
    FROM anotherTable 
    JOIN anotherTable2 ON tx.serviceId = anotherTable2.id 
    WHERE anothertable.id=tx.id and 
    transaction.status = :filter1 and transaction.filter2 = :filter2, 
    ...) 
+0

Вы правы, я получаю некоторые улучшения с «выходами»! Я также обновил свой запрос, как вы мне предложили, спасибо. – Fab

1

попробовать это:

UPDATE transaction 
SET transaction.status = 'TO_EXECUTE' 
From anotherTable 
JOIN anotherTable2 ON transaction.serviceId = anotherTable2.id 
WHERE transaction.id = anotherTable.id AND transaction.status = :filter1, transaction.filter2 = :filter2, ... 
Смежные вопросы