프로시저내 단순 UPDATE문 속도개선 관련 도와주세요!! 0 2 1,644

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문에 도움이 되는지는 모르겠습니다.

혹시 조금이라도 속도를 개선할 방법이 없을까해서 문의드립니다.
고수님들 도와주세요!!

 

 

by 마농 [2018.05.23 14:29:13]

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'
;

 


by nitrobanco [2018.05.24 13:59:16]

감사합니다!!. 바로적용해볼께요

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입