MERGE 문을 활용한 UPSERT – 오라클에서 조건부 INSERT/UPDATE 처리하는 방법
데이터를 조건에 따라 삽입하거나 갱신하는 작업은 실무에서 자주 요구되는 패턴입니다. 특히 대상 테이블에 해당 조건의 데이터가 존재하면 UPDATE, 없으면 INSERT하는 작업은 'UPSERT'라고도 불립니다. 오라클에서는 이 작업을 MERGE
문으로 효과적으로 처리할 수 있습니다.
MERGE 문 기본 구조
오라클의 MERGE
문은 USING
절을 통해 비교할 대상 데이터를 지정하고, ON
절에서 조건을 비교한 뒤, WHEN MATCHED
, WHEN NOT MATCHED
절을 통해 조건에 따라 UPDATE 또는 INSERT를 수행합니다.
MERGE INTO 대상테이블 A
USING (서브쿼리 또는 임시테이블) B
ON (A.기준컬럼 = B.기준컬럼)
WHEN MATCHED THEN
UPDATE SET A.컬럼1 = B.컬럼1
WHEN NOT MATCHED THEN
INSERT (컬럼1, 컬럼2) VALUES (B.컬럼1, B.컬럼2);
실전 예제: 고객 포인트 데이터 갱신
예를 들어 고객 포인트 정보를 업데이트하거나, 신규 고객은 삽입하고 싶을 때 다음과 같은 방식으로 사용할 수 있습니다.
MERGE INTO CUSTOMER_POINT T
USING (
SELECT 'C101' AS CUST_ID, 150 AS POINT FROM DUAL
) S
ON (T.CUST_ID = S.CUST_ID)
WHEN MATCHED THEN
UPDATE SET T.POINT = T.POINT + S.POINT
WHEN NOT MATCHED THEN
INSERT (CUST_ID, POINT) VALUES (S.CUST_ID, S.POINT);
이 쿼리는 고객 ID가 'C101'인 고객이 이미 존재하면 해당 고객의 포인트를 누적 업데이트하고, 존재하지 않으면 새로 삽입합니다.
WHERE 조건으로 세분화하기
WHEN MATCHED
절에는 AND
조건을 추가하여 더욱 세밀하게 UPDATE 조건을 제한할 수 있습니다.
WHEN MATCHED AND T.POINT < 1000 THEN
UPDATE SET T.POINT = T.POINT + S.POINT
이렇게 하면 포인트가 일정 기준 이하일 때만 갱신되도록 설정할 수 있습니다.
MERGE 문 사용 시 주의사항
ON
조건은 중복되지 않도록 고유 식별자가 필요합니다. 중복되면 ORA-30926 에러가 발생할 수 있습니다.USING
절은 단일 로우를 보장하거나, 반드시JOIN
대상이 고유해야 합니다.- 트리거가 설정된 테이블에 사용 시, INSERT/UPDATE 트리거가 모두 작동하므로 주의가 필요합니다.
- DML 성능 튜닝이 필요할 경우, MERGE 문도 힌트 사용이 가능합니다 (
/*+ MERGE(...) */
등).
실무 활용 팁
- 로그 데이터를 기반으로 특정 조건에 맞게 집계 테이블을 갱신할 때 매우 유용합니다.
- 대량 배치 처리 시 INSERT와 UPDATE를 분리하는 것보다 MERGE로 통합하는 것이 트랜잭션 관리와 성능 면에서 이점이 있습니다.
- 반복적인 IF EXISTS → UPDATE ELSE INSERT 패턴을 코드로 구현하는 대신 MERGE로 간결하게 대체 가능합니다.
UPSERT는 단순한 테이블 갱신이지만, 실수 없이 안정적으로 처리하려면 MERGE 구문의 조건 구성과 예외 처리에 신경 써야 합니다. 위 예제를 바탕으로 업무 환경에 맞게 수정하여 적용할 수 있습니다.
#MERGE문 #UPSERT #오라클쿼리 #OracleSQL #조건부갱신 #SQL실무 #SQL튜닝 #INSERTUPDATE
'오라클 실무 쿼리 튜닝' 카테고리의 다른 글
오라클 옵티마이저 통계 수집 실무 가이드 – 자동 수집 vs 수동 수집, 무엇이 더 좋을까? (0) | 2025.05.16 |
---|---|
서브쿼리 성능 최적화 – 서브쿼리에서 성능을 끌어올리는 5가지 방법 (0) | 2025.04.16 |
WHERE 조건은 인덱스를 타는데 왜 느릴까? – INDEX RANGE SCAN의 함정과 대처법 (0) | 2025.04.15 |
SELECT COUNT(*)가 느릴 때 – 성능 개선 전략과 대안 (0) | 2025.04.15 |
INDEX가 안 잡힐 때 확인할 조건 – 오라클 인덱스 미사용 원인 정리 (0) | 2025.04.15 |