[84일차] MERGE

저요·2022년 12월 15일

2022 100th day challenge

목록 보기
83/97

MERGE구문이란?

MERGE구문이란 UPDATE와 INSERT를 한 번에 해결해주는 쿼리이다.

어떠한 데이터를 기존의 테이블에 집어넣을때 중복 데이터가 있다면 UPDATE를, 중복되는 데이터가 아닌 신규 데이터라면 INSERT를 하는 프로세스가 필요할 때 많이 사용된다. 만약 MERGE를 사용하지 않는다면, 우리는 데이터가 존재하는지 아니면 존재하지 않는지 IF문으로 분기처리를 실행해야한다. MERGE를 사용하면 이러한 과정을 한 번에 묶어서 처리할 수 있음으로 편리하다! 실무에서도 많이 사용하니 알아두는 것이 좋다!

MERGE 기본 문법

-- SQL Server and Azure SQL Database
[ WITH <common_table_expression> [,...n] ]  
MERGE
    [ TOP ( expression ) [ PERCENT ] ]
    [ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]  
    USING <table_source> [ [ AS ] table_alias ]
    ON <merge_search_condition>  
    [ WHEN MATCHED [ AND <clause_search_condition> ]  
        THEN <merge_matched> ] [ ...n ]  
    [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]  
        THEN <merge_not_matched> ]  
    [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]  
        THEN <merge_matched> ] [ ...n ]  
    [ <output_clause> ]  
    [ OPTION ( <query_hint> [ ,...n ] ) ]
;  

<target_table> ::=  
{
    [ database_name . schema_name . | schema_name . ]  
  target_table  
}  

<merge_hint>::=  
{  
    { [ <table_hint_limited> [ ,...n ] ]  
    [ [ , ] INDEX ( index_val [ ,...n ] ) ] }  
}  

<merge_search_condition> ::=  
    <search_condition>  

<merge_matched>::=  
    { UPDATE SET <set_clause> | DELETE }  

<merge_not_matched>::=  
{  
    INSERT [ ( column_list ) ]
        { VALUES ( values_list )  
        | DEFAULT VALUES }  
}  

<clause_search_condition> ::=  
    <search_condition>
    
 <출처 : https://learn.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver16#syntax >   

설명하자면, MERGE로 타겟이 되는 모수 테이블을 INTO 다음에 세팅을 한다. 그 뒤에 USING 뒤에는 데이터를 이용할 테이블을 적는다. 그리고 ON으로 둘의 MERGE 조건을 건다. WHEN MATCHED하면 어떻게 할 것인지를 설정하고 기타 OPTION은 마지막에 적는다.

MERGE는 불연속적인 INSERT와 UPDATE, DELETE 작업에서는 적절하지만, 과도한 동시성이 예상되는 경우에는 별도로 INSERT, UPDATE, DELETE작업을 하는 것이 더 수월 할 수도 있다. 성능을 생각한다면 어떤 것이 더 IO비용을 덜 소비하는지 생각하며 쿼리를 짜는 것이 좋다.

만약 MERGE로 인해 PK가 삽입, 업데이트 될 것으로 예상된다면 HOLDLOCK을 지정하여 고정 키 위반을 방지할 수 있다.

참고

https://youtu.be/YN5DI2ZXfoU
https://learn.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver16#syntax

profile
웹개발

0개의 댓글