by nitrobanco [PL/SQL] UPDATE문 UPDATE문 속도개선 [2018.05.23 10:53:36]
고수님들 도와주세요!!! FOR I IN( SELECT * FROM....... ) LOOP UPDATE A@DBLINK SET SCD1 = '80' , SCD2 = '3' , QTY = I.QTY , SCD3 = I.SCD , REASON = I.REASON , YN = 'N' WHERE H_NO = I.H_NO AND D_NO = I.D_NO END LOOP; A@DBLINK의 데이터건수는 약 150만건입니다. 기본 PK인덱스제외하고 H_NO, D_NO의 UNIQUE 인덱스를 가지고있고 그외 NONUNIQUE 인덱스가 2개 있습니다. 프로시저내 다음과같이 조인할것도없이 단순UPDATE문인데 건당 0.4초씩 걸리고있습니다. 해당 쿼리의 조건절에는 UNIQUE인덱스가 생성되어있습니다. 제가 튜닝으로 지식이 얕아서 해당 인덱스가 UPDATE문에 도움이 되는지는 모르겠습니다. 혹시 조금이라도 속도를 개선할 방법이 없을까해서 문의드립니다. 고수님들 도와주세요!!
1. 우선 DB링크를 사용하면 느립니다.
2. 업데이트 컬럼이 인덱스 컬럼인 경우에도 느립니다.
3. 데이터 량이 많으면 느립니다.
4. 루프 돌리면 느립니다.
1,2,3 번은 구조적인 문제라 단순 해결은 어려울 것이고요.
4 번은 한방쿼리로 해결이 가능합니다.
UPDATE 구문은 서브쿼리를 사용해야 하므로 MERGE 문이 더 빠를 듯.
UPDATE a@dblink a SET (scd1, scd2, qty, scd3, reason, yn) = (SELECT '80', '3', qty, scd, reason, 'N' FROM (SELECT * FROM ...) b WHERE b.h_no = a.h_no AND b.d_no = a.d_no ) WHERE EXISTS (SELECT 1 FROM (SELECT * FROM ...) b WHERE b.h_no = a.h_no AND b.d_no = a.d_no ) ; MERGE INTO a@dblink a USING (SELECT * FROM ...) b ON ( a.h_no = b.h_no AND a.d_no = b.d_no) WHEN MATCHED THEN UPDATE SET scd1 = '80' , scd2 = '3' , qty = b.qty , scd3 = b.scd , reason = b.reason , yn = 'N' ;