반응형

오라클 사용 시 데이터 유무에 따라 insert를 할지 update를 할지 결정해야 할 때가 있다. 그럴 때 사용하는 문법인 merge into가 있다. 오라클 9i부터 사용 가능하다. 내가 처음 개발을 배울 때에도 merge into가 있었지만 될 수 있으면 사용하지 않는 것이 좋다고 배웠다. 그냥 그렇게 배웠기 때문에 안 썼는데 요즘엔 상당히 많이 쓰이는 것 같아 이번에 확실히 장단점을 알고 싶어 정리해본다.

1. 장점

간편하다. merge into를 쓰지 않으려면 비지니스 로직단에서 select를 한번 한 다음 데이터 유무에 따라 분기하여 insert를 할지 update를 할지 결정하여 처리하여야 한다. 

코드라인이 확 줄어든다. select -> 결과 비교 및 분기 처리 -> insert or update로 이어지는 긴 로직을 merge  into 하나로 정리할 수 있다.

 

2. 단점

가독성이 떨어진다. 문법을 정확히 이해하지 않고 있다면 select 후 비교 해서 처리하는 것보다 가독성이 떨어진다. 물론 문법에 익숙해져 있다면 오히려 더 쉽게 읽힐 수도 있다.

DB변경 시 To-Be DB에 merge into와 같은 함수가 존재하지 않는다면 엄청나게 손이 많이 간다. 그러나 DB 엔진을 바꾸는 일은 거의 일어나지 않는다. 나는 한 번도 경험해 보지 못했다.

 

3. 퍼포먼스

장점이기도 단점이기도 한 것 같다. 코드 라인이 상당히 줄어들기 때문에 개발 퍼포먼스는 상당히 올라갈 것 같다. 쿼리 속도는 어떨까. 내가 운영 중인 테이블들은 무겁지 않아서 그런지 별 차이를 못느끼겠다. merge into는 테이블 간의 조인이 필수 이기 때문에 테이블 간의 관계와 인덱스가 잘 정리되어 있어야 더 효율적인 것 같다. 

 

4. 결론

닥치고 merge into ㄱㄱ. 오라클에서 쓰라고 만들었는데 안쓸 이유가 없어 보인다.

 

 

5. 사용법

MERGE INTO 테이블 A --insert or update 할 테이블
/*키값 비교*/
USING (SELECT #{YEAR} AS YEAR
            , #{MONTH} AS MONTH
         FROM DUAL) B
   ON (A.YEAR = B.YEAR AND A.MONTH = B.MONTH)
/*키값이 존재하면 update*/
WHEN MATCHED THEN
           UPDATE --테이블 명을 쓰지 않는다
              SET A.컬럼1 = #{컬럼1}
                , A.컬럼2 = #{컬럼2}
            WHERE YEAR = #{YEAR}
              AND MONTH = #{MONTH}
WHEN NOT MATCHED THEN
/*키값이 존재하지 않으면 insert*/
            INSERT ( --마찬가지로 테이블 명을 쓰지 않는다
                    A.컬럼1
                  , A.컬럼2
                   )
            VALUES (
                    #{컬럼1}
                  , #{컬럼2}
                   )
;
반응형

+ Recent posts