OraclE

벌크 insert 빠르게 하는 방법

타마마임팩트_쫀 2018. 3. 21. 14:36

기본적으로 100만개의 레코드를 벌크 인서트 할 때 아래 방법을 사용 합니다.

create table LARGE_TBL (id number, value varchar2(50));

 

begin

        for i in 1 .. 1000000 loop

                insert into large_tbl values (i,'foobar');

        end loop;

        commit;

end;

/

 

PL/SQL procedure successfully completed.

 

Elapsed: 00:00:40.53

 

call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.00       0.00          0          0          0           0

Execute 1000000     15.67      15.42         11       2838    1040617     1000000

Fetch        0      0.00       0.00          0          0          0           0

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total   1000001     15.67      15.42         11       2838    1040617     1000000

 

그럼 테이블 레코드 형식의 배열에 값을 저장하고 한번에 insert 하면,

declare

        TYPE tbl_ins IS TABLE OF LARGE_TBL%ROWTYPE index by binary_integer;

        w_ins tbl_ins;

begin

        for i in 1 .. 1000000 loop

                w_ins(i).id := i;

                w_ins(i).value := 'foobar';

        end loop;

       

        forall i in 1 .. 1000000 insert into large_tbl values w_ins(i);

        commit;

end;

/

 

PL/SQL procedure successfully completed.

 

Elapsed: 00:00:01.26

 

call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.00       0.00          0          0          0           0

Execute      1      0.49       0.50         11       4804      24093     1000000

Fetch        0      0.00       0.00          0          0          0           0

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total        2      0.49       0.51         11       4804      24093     1000000

 

느낌이 오시나요?

sql 실행 횟수가 줄어 듭니다.