오라클 사용 시 데이터 유무에 따라 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}
)
;
'컴퓨터&프로그래밍' 카테고리의 다른 글
[MSSQL, 오라클] 테이블 복사(백업) (0) | 2022.11.14 |
---|---|
[오라클] 토드로 테이블 PK 변경, 키 값 변경 (0) | 2022.11.01 |
[DB] 토드 Toad 단축키 (0) | 2022.06.21 |
[오라클] 오라클 데이터 복구 (TIMESTAMP 타임스탬프) (0) | 2022.06.20 |
[한글] 한글 맞춤법 빨간줄 없애기 (맞춤법 검사 끄기) (0) | 2022.06.20 |