2017-02-13 2 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를받을 당신이 "빠른 웹 서비스를 개발하는 방법 ..."과 같은 문제를 해결하기 위해 월급을받는다면, 여기에 그런 광범위한 질문에 대한 답을 듣고 싶습니까? – 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, ... 
관련 문제