programing

큰 테이블의 행을 업데이트하는 가장 뛰어난 방법

copyandpastes 2022. 9. 25. 22:34
반응형

큰 테이블의 행을 업데이트하는 가장 뛰어난 방법

테이블이 2개 있습니다.

요청:

idㅤㅤ|ㅤㅤaccountㅤㅤㅤㅤ|ㅤsubaccountㅤ|ㅤamountㅤ|ㅤㅤupdatedAmount    

1ㅤㅤ|ㅤㅤACCOUNT_1ㅤㅤ|ㅤㅤㅤ12ㅤㅤㅤ|ㅤㅤ10.2ㅤㅤ|ㅤㅤnull       
2ㅤㅤ|ㅤㅤACCOUNT_2ㅤㅤ|ㅤㅤㅤ45ㅤㅤㅤ|ㅤㅤ0ㅤㅤㅤ|ㅤㅤnull          
3ㅤㅤ|ㅤㅤACCOUNT_3ㅤㅤ|ㅤㅤㅤ11ㅤㅤㅤ|ㅤㅤ50.6ㅤㅤ|ㅤㅤnull   

 

일별 데이터:

idㅤㅤ|ㅤㅤaccountㅤㅤㅤㅤ|ㅤsubaccountㅤ|ㅤamountㅤ

1ㅤㅤ|ㅤㅤACCOUNT_1ㅤㅤ|ㅤㅤㅤ45ㅤㅤㅤ|ㅤㅤ3.12     
2ㅤㅤ|ㅤㅤACCOUNT_1ㅤㅤ|ㅤㅤㅤ12ㅤㅤㅤ|ㅤㅤ15        
3ㅤㅤ|ㅤㅤACCOUNT_2ㅤㅤ|ㅤㅤㅤ11ㅤㅤㅤ|ㅤㅤ1.09     
4ㅤㅤ|ㅤㅤACCOUNT_2ㅤㅤ|ㅤㅤㅤ70ㅤㅤㅤ|ㅤㅤ30.6     
5ㅤㅤ|ㅤㅤACCOUNT_3ㅤㅤ|ㅤㅤㅤ11ㅤㅤㅤ|ㅤㅤ50.6  

요청 테이블의 updatedAmount 열을 다음 기준에 맞게 업데이트해야 합니다.

- DailyData 테이블에서 동일한 AND 하위 계정을 가진 행을 발견한 경우에만 행을 업데이트합니다.
·테이블마다 컬럼 양 값이 다른 경우에만 갱신됩니다.

이 조건이 충족되는 행의 경우 (DailyData 테이블에서) updatedAmount(Request 테이블) 열에 양이 저장됩니다.

따라서 이 예에서는 ID 1만 갱신되는 출력을 얻을 수 있습니다.

idㅤㅤ|ㅤㅤaccountㅤㅤㅤㅤ|ㅤsubaccountㅤ|ㅤamountㅤ|ㅤㅤupdatedAmount    

1ㅤㅤ|ㅤㅤACCOUNT_1ㅤㅤ|ㅤㅤㅤ12ㅤㅤㅤ|ㅤㅤ10.2ㅤㅤ|ㅤㅤ15              
2ㅤㅤ|ㅤㅤACCOUNT_2ㅤㅤ|ㅤㅤㅤ45ㅤㅤㅤ|ㅤㅤ0ㅤㅤㅤ|ㅤㅤnull                    
3ㅤㅤ|ㅤㅤACCOUNT_3ㅤㅤ|ㅤㅤㅤ11ㅤㅤㅤ|ㅤㅤ50.6ㅤㅤ|ㅤㅤnull   

         

저의 큰 문제는 퍼포먼스입니다.이것은 일일 프로세스이며 요청 테이블에는 + 100만 행이 있는 반면 DailyProcess 테이블에는 매일 변경되는 약 30만 행이 있습니다.지금까지 두 가지 방법을 만들었지만 둘 다 시간이 많이 걸립니다.

1:

UPDATE Request r                                              
LEFT OUTER JOIN DailyData d                                              
ON r.account = d.account AND r.subaccount = d.subaccount                                              
SET r.updatedAmount = d.amount                                 

2:

UPDATE Request r, DailyData d                                              
SET r.updatedAmount = d.amount                                              
WHERE r.account = d.account AND r.subaccount = d.subaccount AND r.amount <> d.amount         
                 

누가 더 빠른 방법을 제안할 수 있나요?어떤 도움이라도 감사할 것이다.

내 말은, 너는 사용할 수 있다.INNER JOIN

UPDATE Request r                                              
INNER JOIN DailyData d                                              
    ON r.account = d.account AND r.subaccount = d.subaccount                                              
SET r.updatedAmount = d.amount
WHERE r.amount <> d.amount;

두 테이블의 인덱스(계정, 서브계정)를 생성하여 업데이트 성능을 향상시킬 수 있습니다.

언급URL : https://stackoverflow.com/questions/70238977/most-performant-way-to-update-rows-on-large-tables

반응형