2017-02-13 72 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解決像你這樣的問題的工資「如何開發一個快速的web服務......」,你想在這個廣泛的問題上得到答案嗎? – Andremoniy

+0

你是對的Andremoniy,我已經編輯了更具體的問題。 – Fab

回答

1

您的查詢的IN部分很可能會被重寫爲「存在」以潛在地獲得改進,具體取決於其他表格佈局和數量。此外,它極有可能是你並不需要在子查詢中再次提到的事務表(或存在於)

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, ...