많은 데이터 업데이트 할때 분할 질문입니다.. 0 1 751

by Tension [MySQL] [2017.03.10 13:07:44]


pk가 없는 테이블인데 

 

데이터가 약 3백만건정도가 들어있습니다.

 

데이터를 옮기면서 컬럼 하나를 update 해야 하는일이 생겼습니다.

조인을 해서 업뎃을 해야하는데

데이타가 많아서 그런지 update가 되지 않아서

 

분할을 해서 업뎃을 해야할거같은데 

 

키값도 없고 해서 limit처럼 걸어서 해야 할거같은데

 

어떻게 해야 할나요 ㅠ

by jkson [2017.03.10 14:57:40]

일단은 저도 대량으로 update해본 경험이 적어서

단순히 공부했던 내용으로만 알려드리면..

DECLARE
 CURSOR CUR
 IS
  SELECT ROWID   -- UPDATE 할 대상 쿼리
    FROM TABLE1;

 TYPE RID IS TABLE OF UROWID;

 RID_PACK RID;
BEGIN
 OPEN CUR;

 LOOP
  FETCH CUR BULK COLLECT INTO RID_PACK LIMIT 10000; -- 만 개씩 처리

  EXIT WHEN RID_PACK.COUNT = 0; -- 데이터가 없으면 종료

  FORALL I IN RID_PACK.FIRST .. RID_PACK.LAST -- 만 개씩 UPDATE
   UPDATE TABLE1
      SET COL1 = 'SSS'
    WHERE ROWID = RID_PACK(I);

  COMMIT;
 END LOOP;

 CLOSE CUR;
END;

BULK COLLECT로 원하는 데이터 건별로 끊어서 처리하고 COMMIT을 반복하게 할 수 있습니다.

해당 프로시저가 수행되는 동안 데이터 추가가 있을 수 있으니

프로시저 종료 후에 다시 한번 SELECT 하여서 데이터 확인하셔야 하구요.

24시간 운영 중인 서버가 아니라면

일과 후에 MERGE문을 통해 한 번의 쿼리로 UPDATE해주는 게 개인적으로는 더 나을 것 같습니다.

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