본문 바로가기
Oracle/운영

BULK INSERT (대량 INSERT 작업) 일반INSERT 작업과 비교

by 취미툰 2021. 11. 18.
반응형

일반 적인 INSERT는 한건씩 처리하며 데이터를 삽입합니다.

PL/SQL을 사용하면 여러 행의 데이터를 절차적으로 처리할 수 있습니다.

 

테스트를 통해 확인해보겠습니다.

DB : Oracle 12.2.0.1

 

테스트 요약 : 각 테이블에 100만건의 데이터를 일반 INSERT와 BULK INSERT를 이용해서 삽입하고 비교 

 

일반 INSERT

 

1.테이블 생성

CREATE TABLE BULKINS2 (A NUMBER, B NUMBER, C NUMBER);

 

2.데이터 삽입

BEGIN
FOR i IN 1..1000000 LOOP
INSERT INTO BULKINS2 VALUES (i, 10, 99);
END LOOP;
COMMIT;
END;
/

 

3.확인

SQL> select count(*) from BULKINS2;

  COUNT(*)
----------
   1000000

 

BULK INSERT

1.테이블 생성

CREATE TABLE BULKINS3 (A NUMBER, B NUMBER, C NUMBER);

 

2,데이터 삽입

PL/SQL 설명을 좀 하자면 TYPE 선언을 할 때 INDEX BY BINARY_INTERGER로 설정하여 인덱스 테이블 형식으로 선언하였습니다. 인덱스 테이블은 테이블의 각 요소가 정수값으로 색인되어 있는 테이블이고 테이블의 각 요소는 불연속적으로 저장되며 테이블의 최대크기를 설정하기 못합니다. 테이블의 인덱스에 대한 데이터형은 BINARY_INTERGER형이어야 합니다. 그래서 bulk_ins의 타입을 인덱스테이블로 설정하고 BINARY_INTERGER형으로 선언하였습니다.

 

그리고 FORALL 구문을 사용하여 한번에 INSERT를 수행합니다

DECLARE
TYPE bulk_ins IS TABLE OF BULKINS%ROWTYPE INDEX BY BINARY_INTEGER;
ysbae bulk_ins;
BEGIN
FOR i IN 1..1000000 LOOP 
   ysbae(i).A :=i;
   ysbae(i).B :=10;
   ysbae(i).C :=99;
END LOOP;
   FORALL i in 1..1000000 INSERT INTO BULKINS3 VALUES ysbae(i);
   COMMIT;
END;
/

출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=agapeuni&logNo=60096910378 

 

[강의] PL/SQL (17) - Collections (Index-by Table)

Collection은 여러 오브젝트를 하나로 묶을 수 있게 해준다. 프로그래밍의 배열과 유사하다. 3가지 유형 1...

blog.naver.com

출처 : https://docs.oracle.com/database/121/LNPLS/forall_statement.htm#LNPLS01321

 

FORALL Statement

The FORALL statement runs one DML statement multiple times, with different values in the VALUES and WHERE clauses. index Name for the implicitly declared integer variable that is local to the FORALL statement. Statements outside the FORALL statement cannot

docs.oracle.com

 

 

3.확인

SQL> select count(*) from bulkins3;

  COUNT(*)
----------
   1000000

 

 

두 INSERT 간의 비교

v$sqlarea의 컬럼값들을 가져와서 서로의 차이를 비교해봅니다.

 

일반 INSERT의 경우에는 EXECUTIONS가 건수만큼 수행되었고, BULK INSERT는 1회 수행되었습니다.

수행시간과 CPU_TIME의 경우에는 BULK INSERT가 훨씬 리소스적으로 효율적으로 수행되었습니다.

USER_IO_WAIT_TIME의 경우에도 BULK INSERT의 경우에는 없는 반면 일반 INSERT의 경우에는 120214 micro seconds(0.120214초)의 wait time이 있었습니다.

 

즉, 상황이 대량의 INSERT를 해야하는 상황이면 BULK INSERT를 수행하면 효율이 높을 수 있을 것 같습니다. 하지만 PL/SQL을 작성해야 하므로 개발 능력이 필요하다는 단점도 존재하는 거 같네요..ㅎ

 

SQL> select sql_text,sql_id,sorts,fetches,executions,parse_calls,disk_reads,direct_writes,direct_Reads,buffer_gets,user_io_wait_time,rows_processed,cpu_time,elapsed_time,locked_total,pinned_total from v$sqlarea
where sql_id='7w1a9ab29a5c9'
or sql_id = '5txs62412trh7'
--where sql_text like '%INSERT%';

SQL_TEXT                                        SQL_ID        SORTS      FETCHES        EXECUTIONS           PARSE_CALLS            DISK_READS           DIRECT_WRITES              DIRECT_READS             BUFFER_GETS            USER_IO_WAIT_TIME                  ROWS_PROCESSED               CPU_TIME         ELAPSED_TIME             LOCKED_TOTAL             PINNED_TOTAL             
----------------------------------------------- ------------- ---------- -------------- -------------------- ---------------------- -------------------- -------------------------- ------------------------ ---------------------- ---------------------------------- ---------------------------- ---------------- ------------------------ ------------------------ ------------------------ 
INSERT INTO BULKINS3 VALUES (:B1 ,:B2 ,:B3 )    5txs62412trh7          0              0                    1                      0                    0                          0                        0                  23180                                  0                      1000000           428729                   748151                        2                        4
INSERT INTO BULKINS2 VALUES (:B1 , 10, 99)      7w1a9ab29a5c9          0              0              1000000                      0                    0                          0                        0                1038209                             120214                      1000000          9307335                 15608531                        2                  1000003

2 rows selected.

 

출처 : https://positivemh.tistory.com/183

 

대량 데이터 삽입 insert 빠르게 실행 벌크 insert

OS환경 : Oracle Linux6.8(64bit) DB 환경 : Oracle Database 11.2.0.4 설명 : 대량 데이터 삽입 insert 빠르게 실행 벌크 insert 배치 처리 또는 장부 작성처럼 대량의 레코드를 생성해야 할 때가 있음 대부분 1..

positivemh.tistory.com

출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=3901299 

 

대량 처리 - [종료]대용량 데이터베이스 스터디 - 개발자, DBA가 함께 만들어가는 구루비 지식창고

대량 처리 <!-- Root decorator: this is a layer of abstraction that Confluence doesn't need. It will be removed eventually. --> PL/SQL 은 한 번에 한 행씩 또는 여러 행의 데이터를 절차적으로 처리할 수 있다. 대량 처리와 한

wiki.gurubee.net

 

반응형

댓글