Skip to content

SQL MERGE #

Find similar titles

7회 업데이트 됨.

Edit
  • 최초 작성자
    htBae
  • 최근 업데이트
    dongiljogun

Structured data

Category
Database

Merge #

소개 #

Merge 문은 소스의 데이터를 사용하여(테이블 참조의 결과) 대상을 갱신 혹은 삽입한다. 조건에 일치하는 대상의 행은 지정된 대로 삭제 및 갱신할 수 있고 대상에 존재하지 않는 행은 삽입할 수 있다.

사용법 #

SQL:2003에서 표준구문으로 도입된 방식을 사용하되 데이터베이스 제품에 따라 표준구문 등록을 하지 않은 일부는 제공하는 유사한 기능(비표준 구문)을 따른다.

표준구문 #

  • Oracle Database
  • DB2
  • Microsoft SQL Server
  • Firebird

    MERGE INTO 테이블 USING 서브 테이블 ON (조건)
    WHEN MATCHED THEN
        UPDATE SET 칼럼 1 = 값 1 [, 칼럼 2 = 값 2 ...]
    WHEN NOT MATCHED THEN
        INSERT (칼럼 1 [, 칼럼 2 ...]) VALUES (값 1 [, 값 2 ...])
    

비표준 구문 #

  • MySQL

    INSERT INTO 테이블(칼럼 1 [, 칼럼 2 ...])
    VALUES(값 1 [, 값 2 ...])
    ON DUPLICATE KEY UPDATE 컬럼1 = '값 1' [, 칼럼 2 = '값 2'...]
    
  • SQLite

    INSERT OR REPLACE INTO 테이블 (칼럼 1 [, 칼럼 2...])
    VALUES (값 1 [, 값 2 ...])
    

주의사항 #

  • 표준구문의 USING 절에는 Merge 대상 테이블이 단독으로 올 수 없다. 오직 다른 테이블을 참조하거나 함께 조인하여 사용해야 한다.
  • Trigger 발생이 되지 않는다.
  • 데이터가 많은 대용량 테이블에선 CPU 점유율이 높아 오히려 성능이 떨어질 수 있으며 단순한 삽입/갱신의 명령문보다 복잡한 명령문에서 사용하는 것이 이상적이다. 아래의 데이터를 통해 대용량 테이블에서 Merge와 단순 DML 명령문을 실행했을 때의 상태 차이를 확인할 수 있다.

    Merge

    • logical read : 4,516,795
    • time : 39sec

    Image

    Simple DML

    • logical read : 203,037
    • time : 28sec

    Image

Reference #

0.0.1_20230725_7_v68