2017-02-13 7 views
0

メインテーブルはtransactionであり、100万行(最大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, ... 
関連する問題