2016-06-08 3 views
-1

5 백만 행을 업데이트하려고합니다. 아래 쿼리는 5-6 분 내에 실행됩니다. 하지만 500000 개 레코드 사이에 주기적으로 커밋을하고 싶습니다. 어떻게해야합니까?오라클의 수백만 행 업데이트

도움을 주시면 감사하겠습니다.

감사

DECLARE 
    a NUMBER; 
    BEGIN 
    UPDATE table1 
    SET (name) = 
     (SELECT name 
      FROM table1 
      WHERE  a1= 24672 

    WHERE ROWNUM <= 6500000; 

    a := SQL%ROWCOUNT; 
    DBMS_OUTPUT.put_line (a || ' Rows Updated'); 
END; 
/
+0

단지 이름이 바뀌므로 오류가 발생해도 5 백만 건이 지나면 나에게 알맞을 것입니다. – Amir

답변

0

당신은 아마 이와 비슷한 일을 할 수 있습니다.

DECLARE 
    a NUMBER; 
    commitCt NUMBER; 
    rowCt NUMBER; 

    BEGIN 
     LOOP 
     commitCt := 0; 
     rowCt := 0; 
     SAVEPOINT svePoint; 

    WHILE rowCt/500000 <= 1 
    LOOP 
     BEGIN 
      rowCt := rowCt + 1; 



      commitCt := commitCt + 1; 

     EXCEPTION 
     WHEN OTHERS THEN 
      ROLLBACK to svePoint; 
     END; 

     END LOOP; 

    COMMIT; 

    IF commitCt = 0 THEN 
     EXIT; 
    END IF; 

     END LOOP; 
END; 
/
0

'최적화'태그를 지정 했으므로 성능에 신경을 써야합니다. PL/SQL에서 SQL을 다시 작성하고 루프를 사용하고 매 반복마다 커밋 할 수 있지만 느려지 게됩니다.

수백만 행을 업데이트하는 가장 빠른 방법은 사실 전혀 업데이트하지 않는 경우가 종종 있습니다. 대신 새 테이블 (CREATE TABLE ... AS ... SELECT)을 만들고 이전 테이블을 삭제 한 다음 새 테이블의 이름을 바꿉니다. 다시 실행 및 실행 취소의 양이 줄어들고 성능이 크게 향상됩니다. 성능 부분 커밋에 관심 아마도 당신이 더 이상 다음 충분하지 않는 경우

How to update millions of rows

를 참조하십시오?

관련 문제