CS 지식/데이터베이스

[데이터베이스 / Oracle] 대량 INSERT (INSERT ALL, INSERT INTO ~ UNION ALL)

ghan2 2024. 9. 12. 11:01

 

INSERT ALL과 INSERT INTO ~ UNION ALL 사용법과 예제 정리

 

INSERT ALL

INSERT ALL 
INTO table([COLUMN1], [COLUMN2], ...)  
VALUES ([VALUE1], [VALUE2], ...)  
INTO table([COLUMN1], [COLUMN2], ...)  
VALUES ([VALUE1], [VALUE2], ...)  
...  
SELECT * FROM DUAL;

 

<insert id="insertFormatList" parameterType="java.util.List">
	<foreach collection="list" item="item" open="INSERT ALL" close="SELECT * FROM DUAL" separator=" ">
        INTO FORMAT_DETAIL 
            ( FORMAT_ID
            , FORMAT
            , ORDER_IDX
            )
        VALUES
            ( #{item.formatId}
            , #{item.format}
            , #{item.orderIdx})
    </foreach>
</insert>

 

INSERT ALL ~ UNION ALL

INSERT INTO [테이블] ([COLUMN1], [COLUMN2], ...) 
	SELECT ([VALUE1], [VALUE2], ...) FROM DUAL UNION ALL 
	SELECT ([VALUE1], [VALUE2], ...) FROM DUAL UNION ALL
	...
	SELECT ([VALUE1], [VALUE2], ...) FROM DUAL;

 

<update id="insertList" parameterType="java.util.List">
        INSERT INTO FORMAT_DETAIL
        ( FORMAT_ID
        , FORMAT
        , ORDER_IDX
        )
        <foreach collection="list" item="item" open="" close="" separator="UNION ALL">
            SELECT
                #{item.formatId}
              , #{item.format}
              , #{item.orderIdx}
            FROM
                DUAL
        </foreach>
    </update>

 

 

작업 방식 및 특징
(자료가 많지 않아 이해한 대로 정리했습니다.)

 

INSERT ALL 

  • 여러 개의 INSERT 문을 한 번에 처리하지만, 각각의 INSERT는 개별적으로 수행한다. 
  • 이 때문에 여러 테이블에도 INSERT가 가능하다.
  • 각 INSERT가 별도의 트리거, 인덱스 갱신, 로그 기록 등의 작업을 처리하게 되어 데이터베이스 연산이 각각 발생할 수 있다. 

INSERT INTO ~ UNION ALL

  • UNION ALL 이라는 키워드를 사용하여 여러 SELECT 문을 하나의 결과 집합으로 결합한 후 한번에 단일 INSERT 작업으로 처리된다. 
  • INSERT INTO 라서 단일 테이블에만 사용 가능하다.
  • 단일 트랜잭션으로 묶여서 처리되기 때문에 트리거, 인덱스 갱신, 로그 기록 등의 부하가 한 번만 발생한다.

 

성능상의 차이

여러 테스트 해본 블로그를 참고하면 단일 테이블에 대한 대용량 인서트 작업은 INSERT INTO ~ UNION ALL 이 약 3~4배 정도 속도가 빨랐다. 사실 이에 대한 이유가 궁금해서 찾아본 것이었는데 정리하고 이해한 결과로는 INSERT ALL 의 묶어서 계속 INSERT를 하는 비용이 UNION ALL의 결과집합을 만드는 비용보다 높기 때문이라는 생각이 들었고 UNIION ALL은 단일 테이블에 인서트 하는 경우에만 사용이 가능하기 때문에 필요에 따라 적절히 선택해보는 것이 좋겠다는 결론을 내렸다.