본문 바로가기

02. SQLP 스터디/05. Oracle 기타

[오라클 PL/SQL] BULK INSERT [31 ~ ] / 45

  • 오라클자바커뮤니티 - 내용 학습

plsql_FORALL_31.sql
0.00MB

성능향상을 위한 FORALL 기반 벌크 입력(BULK INSERT)실습

[실습]
사번(empno), 이름(ename), 직무(job) 3개의 컬럼을 갖는 BULKTEST 라는 테이블을
생성하여 100만건 정도 데이터를 입력하는데, 개별 건씩 입력 하는것과 FORALL을
이용하여 벌크로 ISERT하는 방식의 성능차이에 대해 확인해 보겠습니다.

FORALL을 이용하여 DML문을 작성하면 한 번에 한 행씩 실행될 모든 DML 문을 생성하고
SQL 실행엔진에 한번에 모두 보냅니다.

FORALL 구문을 이용하면 INSERT, UPDATE, DELETE와 같은 DML 사용시 컬렉션을
사용하며 매우 빠르게 작업을 할 수 있습니다.

FORALL 구문은 데이터를 오라클의 TABLE TYPE(배열)에 담아서 한번에 SQL 실행엔진에
넘겨서 실행을 하므로 성능 향상에 도움이 됩니다.

1. 실습 테이블 생성

create table bulktest(
empno number primary key,
ename varchar2(20),
job varchar2(50));

set timing on

 declare
    cnt number := 0;
 begin
    while(cnt <100) loop
        cnt := cnt + 1;
        insert /*+ loop insert */ into bulktest values (cnt, cnt ||'길동', '슈퍼맨');
    end loop;
 end ;
 
 
 select substr(sql_text,1,60) "sql", count(*), sum(executions) "총실행횟수"
 from v$sqlarea
 where sql_text like '%loop%'
 group by substr(sql_text,1,60)
 having count(*) >0
 order by 2;
 
 
   
select count(1) from bulktest;

select * from bulktest;
truncate table bulktest;

-- alter system flush SHARED_POOL

 declare
    type bulktype is table of bulktest%rowtype index by binary_integer;
    mydata bulktype;
 begin
    for i in 1..100 loop
        mydata(i).empno := i;
        mydata(i).ename := i || '길동';
        mydata(i).job := i || '생산직';
    end loop;
    
    forall i in 1..100 insert /*+ loop after insert */ into bulktest values mydata(i);
 end ;
 
 
 select count(1) from bulktest;
 select * from bulktest;
 select substr(sql_text,1,60) "sql", count(*), sum(executions) "총실행횟수"
 from v$sqlarea
 where sql_text like '%loop%'
 group by substr(sql_text,1,60)
 having count(*) >0
 order by 2;