- 2019 년 8 월 20 일
- 읽는 데 25 분
-
- X
- c
- j
- r
- a
-
+18
적용 대상 : SQL Server (지원되는 모든 버전) Azure SQL Database Azure Synapse Analytics
다음에서 대상 테이블에 대한 삽입, 업데이트 또는 삭제 작업을 실행합니다. 소스 테이블과의 조인 결과. 예를 들어, 다른 테이블에서 발견 된 차이점을 기반으로 한 테이블에서 행을 삽입, 업데이트 또는 삭제하여 두 테이블을 동기화합니다.
참고
MERGE는 현재에 대한 미리보기입니다. Azure Synapse Analytics.
성능 팁 : MERGE 문에 대해 설명 된 조건부 동작은 두 테이블에 일치하는 특성이 복잡하게 혼합되어있을 때 가장 잘 작동합니다. 예를 들어, 행이없는 경우 삽입하거나 일치하는 경우 행을 업데이트합니다. 다른 테이블의 행을 기반으로 한 테이블을 단순히 업데이트하는 경우 기본 INSERT, UPDATE 및 DELETE 문을 사용하여 성능과 확장 성을 향상시킵니다. 예 :
Transact-SQL 구문 규칙
구문
참고
SQL Server 2014 및 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하십시오.
인수
WITH < common_table_expression >
정의 된 임시 명명 된 결과 집합 또는보기 (공통 테이블 식이라고도 함)를 지정합니다. MERGE 문의 범위 내에서. 결과 집합은 단순 쿼리에서 파생되며 MERGE 문에서 참조됩니다. 자세한 내용은 WITH common_table_expression (Transact-SQL)을 참조하십시오.
TOP (expression)
영향을받는 행의 수 또는 백분율을 지정합니다. expression은 행의 숫자 또는 백분율 일 수 있습니다. TOP 표현식에서 참조되는 행은 어떤 순서로도 정렬되지 않습니다. 자세한 내용은 TOP (Transact-SQL)을 참조하십시오.
TOP 절은 전체 원본 테이블과 전체 대상 테이블 조인 및 삽입, 업데이트 또는 삽입에 적합하지 않은 조인 된 행 후에 적용됩니다. 삭제 작업이 제거됩니다. TOP 절은 조인 된 행 수를 지정된 값으로 추가로 줄입니다. 삽입, 업데이트 또는 삭제 작업은 순서가 지정되지 않은 방식으로 나머지 조인 된 행에 적용됩니다. 즉, 행은 WHEN 절에 정의 된 조치간에 분배됩니다. 예를 들어 TOP (10)을 지정하면 10 개의 행에 영향을줍니다. 이 행 중 7 개를 업데이트하고 3 개를 삽입하거나 1 개를 삭제하고 5 개를 업데이트하고 4 개를 삽입하는 등의 작업을 수행 할 수 있습니다.
MERGE 문은 소스와 소스 모두에 대한 전체 테이블 스캔을 수행하기 때문입니다. 여러 배치를 생성하여 대형 테이블을 수정하기 위해 TOP 절을 사용할 때 I / O 성능이 때때로 영향을받습니다. 이 시나리오에서는 모든 연속 배치가 새 행을 대상으로하는지 확인하는 것이 중요합니다.
database_name
target_table이있는 데이터베이스의 이름입니다.
schema_name
target_table이 속한 스키마의 이름입니다.
target_table
< table_source 는 < clause_search_condition >에 따라 일치합니다. target_table은 삽입, 업데이트 또는 삭제 작업의 대상입니다. MERGE 문의 WHEN 절에 의해 지정됩니다.
target_table이 뷰인 경우 이에 대한 모든 작업은 뷰 업데이트 조건을 충족해야합니다. 자세한 내용은 뷰를 통해 데이터 수정을 참조하세요.
target_table은 원격 테이블이 될 수 없습니다. target_table에 정의 된 규칙이 없습니다.
table_alias
target_table에 대한 테이블을 참조하는 대체 이름입니다.
< table_source >
< merge_search 조건 >. 이 일치의 결과는 MERGE 문의 WHEN 절에서 수행 할 작업을 나타냅니다. < table_source >는 원격 테이블 또는 원격 테이블에 액세스하는 파생 테이블 일 수 있습니다.
< table_source >는 Transact-SQL 테이블 값 생성자를 사용하여 여러 행을 지정하여 테이블을 구성하는 파생 테이블 일 수 있습니다.
table_alias
table_source에 대한 테이블을 참조하는 대체 이름
이 절의 구문 및 인수에 대한 자세한 내용은 FROM (Transact-SQL)을 참조하세요.
ON < merge_search_condition >
< table_source >는 target_table과 조인하여 일치하는 위치를 결정합니다.
주의
만 지정하는 것이 중요합니다. 일치 목적으로 사용할 대상 테이블의 열입니다. 즉, 소스 테이블의 해당 열과 비교되는 대상 테이블의 열을 지정합니다. 대상 테이블의 행을 필터링하여 쿼리 성능을 향상시키지 마십시오. ON 절; 예 : AND NOT target_table.column_x = value
지정. 이렇게하면 예상치 못한 잘못된 결과가 반환 될 수 있습니다.
일치하는 경우 < merge_matched >
< table_source > ON < merge_search_condition > 및 추가 검색 조건을 충족하는 경우 < merge_matched 절.
MERGE 문은 최대 2 개의 WHEN MATCHED 절을 가질 수 있습니다. 두 개의 절이 지정된 경우 첫 번째 절은 AND < search_condition > 절과 함께 제공되어야합니다. 주어진 행에 대해 두 번째 WHEN MATCHED 절은 첫 번째가 아닌 경우에만 적용됩니다. WHEN MATCHED 절이 두 개인 경우 하나는 UPDATE 작업을 지정하고 다른 하나는 DELETE 작업을 지정해야합니다.
merge_matched > 절 및 < table_source 가 < merge_search_condition >에 따라 target_table의 행과 일치하면 SQL Server에서 오류를 반환합니다. MERGE 문은 다음과 같이 할 수 있습니다.” t 동일한 행을 두 번 이상 업데이트하거나 동일한 행을 업데이트 및 삭제합니다.
일치하지 않는 경우 < merge_not_matched >
< table_source > ON merge_search_condition > et_table, 추가 검색 조건 (있는 경우)을 충족합니다. 삽입 할 값은 < merge_not_matched > 절에 의해 지정됩니다. MERGE 문은 WHEN NOT MATCHED 절을 하나만 가질 수 있습니다.
WHEN NOT MATCHED BY SOURCE THEN < merge_matched >
< table_source > ON < merge_search_condition > 및 추가 검색 조건을 충족하는 경우 < merge_matched에 따라 업데이트 또는 삭제됩니다. > 절.
MERGE 문은 WHEN NOT MATCHED BY SOURCE 절을 최대 2 개까지 포함 할 수 있습니다. 2 개의 절이 지정된 경우 첫 번째 절에는 AND < clause_search_condition > 절. 주어진 행에 대해 두 번째 WHEN NOT MATCHED BY SOURCE 절은 첫 번째가 아닌 경우에만 적용됩니다. ” 티. WHEN NOT MATCHED BY SOURCE 절이 두 개있는 경우 하나는 UPDATE 작업을 지정하고 다른 하나는 DELETE 작업을 지정해야합니다. < clause_search_condition >에서는 대상 테이블의 열만 참조 할 수 있습니다.
< table_source >, 소스 테이블의 열에 액세스 할 수 없습니다. 업데이트 또는 삭제 작업이 merge_matched > 절이 소스 테이블의 열을 참조하면 오류 207 (잘못된 열 이름)이 반환됩니다. 예를 들어 는 소스 테이블의 Col1
에 액세스 할 수 없기 때문에 문이 실패 할 수 있습니다.
및 < clause_search_condition >
유효한 검색 조건을 지정합니다. 자세한 내용은 검색 조건 (Transact-SQL)을 참조하십시오.
< table_hint_limited >
각 항목에 대해 대상 테이블에 적용 할 하나 이상의 테이블 힌트를 지정합니다. e MERGE 문에 의해 수행 된 작업을 삽입, 업데이트 또는 삭제합니다. WITH 키워드와 괄호가 필요합니다.
NOLOCK 및 READUNCOMMITTED는 허용되지 않습니다. 테이블 힌트에 대한 자세한 내용은 테이블 힌트 (Transact-SQL)를 참조하십시오.
INSERT 문의 대상인 테이블에 TABLOCK 힌트를 지정하면 TABLOCKX 힌트를 지정하는 것과 동일한 효과가 있습니다. 테이블에 배타적 잠금이 적용됩니다. FORCESEEK가 지정되면 다음이 적용됩니다. 소스 테이블과 조인 된 대상 테이블의 암시 적 인스턴스
주의
WHEN NOT MATCHED THEN INSERT로 READPAST를 지정하면 UNIQUE 제약 조건을 위반하는 INSERT 작업이 발생할 수 있습니다.
INDEX (index_val)
소스 테이블과 암시 적 조인을 수행하기 위해 대상 테이블에있는 하나 이상의 인덱스의 이름 또는 ID를 지정합니다. 자세한 내용은 테이블 힌트 (Transact -SQL).
< output_clause >
target_table의 모든 행에 대한 행을 반환합니다. 특정 순서없이 업데이트, 삽입 또는 삭제. $ action은 출력 절에 지정할 수 있습니다. $ action은 해당 행에서 수행 된 작업에 따라 각 행에 대해 “INSERT”, “UPDATE”또는 “DELETE”의 세 값 중 하나를 반환하는 nvarchar (10) 유형의 열입니다. 이 절의 인수 및 동작에 대한 자세한 내용은 OUTPUT 절 (Transact-SQL)을 참조하십시오.
< merge_matched >
< table_source ON < merge_search_condition >, 추가 검색 조건을 충족합니다.
UPDATE SET < set_clause >
대상 테이블에서 업데이트 할 열 또는 변수 이름 목록과이를 업데이트 할 값을 지정합니다.
이 절의 인수에 대한 자세한 내용은 UPDATE (Transact-SQL)를 참조하십시오. 변수를 열과 동일한 값으로 설정하는 것은 지원되지 않습니다.
DELETE
target_table의 행과 일치하는 행이 삭제되도록 지정합니다.
< merge_not_matched >
대상 테이블에 삽입 할 값을 지정합니다.
(column_list)
또는 데이터를 삽입 할 대상 테이블의 추가 열입니다. 열은 단일 부분 이름으로 지정해야합니다. 그렇지 않으면 MERGE 문이 실패합니다. column_list는 괄호로 묶고 쉼표로 구분해야합니다.
VALUES ( values_list)
대상 테이블에 삽입 할 값을 반환하는 상수, 변수 또는 표현식의 쉼표로 구분 된 목록입니다. 표현식은 EXECUTE 문을 포함 할 수 없습니다.
DEFAULT VALUES
각 열에 정의 된 기본값을 포함하는 삽입 된 행입니다.
이 절에 대한 자세한 내용은 INSERT (Transact-SQL)를 참조하십시오.
< search_condition >
사양 < merge_search_condition > 또는 < clause_search_condition . 이 절의 인수에 대한 자세한 내용은 검색 조건 (Transact-SQL)을 참조하십시오.
< 그래프 검색 패턴 >
그래프 일치 패턴을 지정합니다. 이 절의 인수에 대한 자세한 내용은 MATCH (Transact-SQL)
주의
참고
Azure Synapse Analytics에서 MERGE를 참조하십시오. 명령 (미리보기)은 SQL 서버 및 Azure SQL 데이터베이스에 비해 다음과 같은 차이점이 있습니다.
- MERGE 업데이트는 삭제 및 삽입 쌍으로 구현됩니다. MERGE 업데이트의 영향을받는 행 수에는 삭제 및 삽입 된 행이 포함됩니다.
- 미리보기 중에 ID 열이있는 테이블은 Synapse SQL MERGE 명령에서 지원되지 않습니다.
- 다음 표에는 배포 유형이 다른 테이블이 설명되어 있습니다.
Azure Synapse Analytics의 병합 조항 지원되는 TARGE 배포 테이블 지원되는 소스 배포 테이블 댓글 일치 할 때 모든 배포 유형 모든 배포 유형 대상과 일치하지 않음 HASH 모든 배포 유형 UPDATE / DELETE FROM… JOIN을 사용하여 두 테이블을 동기화합니다. 소스별로 일치하지 않음 모든 배포 유형 모든 배포 유형
3 개의 MATCHED 절 중 하나 이상을 지정해야하지만 순서에 관계없이 지정할 수 있습니다. 동일한 MATCHED 절에서 변수를 두 번 이상 업데이트 할 수 없습니다.
MERGE 문에 의해 대상 테이블에 지정된 삽입, 업데이트 또는 삭제 작업은 계단식 참조 무결성 제약 조건을 포함하여 테이블에 정의 된 제약 조건에 의해 제한됩니다. IGNORE_DUP_KEY가 대상 테이블의 고유 인덱스에 대해 ON이면 MERGE는이 설정을 무시합니다.
MERGE 문에는 문 종결 자로 세미콜론 (;)이 필요합니다. 종료 자없이 MERGE 문을 실행하면 오류 10713이 발생합니다.
MERGE 이후에 사용하면 @@ ROWCOUNT (Transact-SQL)는 클라이언트에 삽입, 업데이트 및 삭제 된 총 행 수를 반환합니다.
MERGE는 데이터베이스 호환성 수준이 100 이상으로 설정된 경우 완전히 예약 된 키워드입니다. MERGE 문은 90 및 100 데이터베이스 호환성 수준에서 사용할 수 있습니다. 그러나 데이터베이스 호환성 수준이 90으로 설정된 경우 키워드는 “완전히 예약되지 않습니다.
대기 업데이트 복제를 사용할 때 MERGE 문을 사용하지 마십시오. MERGE 및 대기 업데이트 트리거는 호환되지 않습니다. MERGE 문을 삽입 또는 업데이트 문으로 바꿉니다.
트리거 구현
에 지정된 모든 삽입, 업데이트 또는 삭제 작업에 대해 MERGE 문에서 SQL Server는 대상 테이블에 정의 된 해당 AFTER 트리거를 실행하지만 트리거를 처음 또는 마지막으로 실행할 동작을 보장하지는 않습니다. 동일한 작업에 대해 정의 된 트리거는 지정한 순서를 따릅니다. 트리거 실행 순서 설정에 대한 자세한 내용은 첫 번째 및 마지막 트리거 지정을 참조하십시오.
대상 테이블에 MERGE 문으로 수행 된 삽입, 업데이트 또는 삭제 작업에 대해 정의 된 활성화 된 INSTEAD OF 트리거가있는 경우 , MERGE 문에 지정된 모든 작업에 대해 활성화 된 INSTEAD OF 트리거가 있어야합니다.
target_table에 INSTEAD OF UPDATE 또는 INSTEAD OF DELETE 트리거가 정의 된 경우 업데이트 또는 삭제 작업이 수행되지 않습니다. 대신 트리거가 실행되고 삽입 및 삭제 된 테이블이 그에 따라 채워집니다.
target_table에 INSTEAD OF INSERT 트리거가 정의되어 있으면 삽입 작업이 수행되지 않습니다. 대신 테이블이 그에 따라 채워집니다.
권한
소스 테이블에 대한 SELECT 권한과 대상 테이블에 대한 INSERT, UPDATE 또는 DELETE 권한이 필요합니다. 자세한 내용은 SELECT, INSERT, UPDATE 및 DELETE 문서의 권한 섹션을 참조하세요.
MERGE 문 성능 최적화
MERGE 문을 사용하여 개별 DML을 바꿀 수 있습니다. 하나의 문장으로 문장. 이는 작업이 단일 명령문 내에서 수행되기 때문에 쿼리 성능을 향상시킬 수 있으므로 소스 및 대상 테이블의 데이터가 처리되는 횟수를 최소화합니다. 그러나 성능 향상은 올바른 인덱스, 조인 및 기타 고려 사항에 따라 달라집니다.
인덱스 모범 사례
MERGE 문의 성능을 향상 시키려면 다음 인덱스 지침을 따르는 것이 좋습니다. :
- 유일하고 포함하는 소스 테이블의 조인 열에 인덱스를 만듭니다.
- 대상 테이블의 조인 열에 고유 한 클러스터형 인덱스를 만듭니다.
이 색인은 결합 키가 고유하고 테이블의 데이터가 정렬되도록합니다. 쿼리 최적화 프로그램이 중복 행을 찾고 업데이트하기 위해 추가 유효성 검사 처리를 수행 할 필요가없고 추가 정렬 작업이 필요하지 않기 때문에 쿼리 성능이 향상됩니다.
JOIN 모범 사례
개선하려면 MERGE 문의 성능을 확인하고 올바른 결과를 얻으려면 다음 조인 지침을 따르는 것이 좋습니다.
- ON < merge_search_condition > 절은 소스 및 대상 테이블의 데이터를 일치시키기위한 기준을 결정합니다. 즉, 소스 테이블의 해당 열과 비교되는 대상 테이블의 열만 지정합니다.
- 상수와 같은 다른 값에 대한 비교는 포함하지 마십시오.
소스 또는 대상 테이블에서 행을 필터링하려면 다음 방법 중 하나를 사용하십시오.
- 적절한 WHEN 절에서 행 필터링에 대한 검색 조건을 지정하십시오. 예를 들어 WHEN NOT MATCHED AND S.EmployeeName LIKE “S %”THEN INSERT ….
- 필터링 된 행을 반환하는 소스 또는 대상에서보기를 정의하고보기를 소스 또는 대상으로 참조합니다. 표. 보기가 대상 테이블에 정의 된 경우 이에 대한 모든 조치는보기 업데이트 조건을 충족해야합니다. 뷰를 사용하여 데이터를 업데이트하는 방법에 대한 자세한 내용은 뷰를 통해 데이터 수정을 참조하십시오.
-
WITH <common table expression>
절을 사용하여 소스 또는 대상 테이블에서 행을 필터링합니다. . 이 방법은 ON 절에 추가 검색 기준을 지정하는 것과 유사하며 잘못된 결과를 생성 할 수 있습니다. 이 방법을 사용하지 않거나 구현하기 전에 철저히 테스트하는 것이 좋습니다.
MERGE 문의 조인 작업은 SELECT 문의 조인과 동일한 방식으로 최적화됩니다. 즉, SQL Server가 조인을 처리 할 때 쿼리 최적화 프로그램은 조인을 처리하는 가장 효율적인 방법 (여러 가능성 중에서)을 선택합니다. 원본과 대상이 비슷한 크기이고 앞서 설명한 인덱스 지침이 원본 및 대상 테이블에 적용되는 경우 병합 조인 연산자가 가장 효율적인 쿼리 계획입니다. 이는 두 테이블이 모두 한 번 스캔되고 데이터를 정렬 할 필요가 없기 때문입니다. 소스가 대상 테이블보다 작을 때는 중첩 루프 연산자를 사용하는 것이 좋습니다.
OPTION (<query_hint>)
절을 지정하여 특정 조인을 강제로 사용할 수 있습니다. MERGE 문. 이 조인 유형은 인덱스를 사용하지 않으므로 MERGE 문에 대한 쿼리 힌트로 해시 조인을 사용하지 않는 것이 좋습니다.
매개 변수화 모범 사례
만약 SELECT, INSERT, UPDATE , 또는 DELETE 문이 매개 변수없이 실행되는 경우 SQL Server 쿼리 최적화 프로그램은 문을 내부적으로 매개 변수화하도록 선택할 수 있습니다. 이는 쿼리에 포함 된 모든 리터럴 값이 매개 변수로 대체됨을 의미합니다. 예를 들어 INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10) 문은 INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2)로 내부적으로 구현 될 수 있습니다. 단순 매개 변수화라고하는이 프로세스는 이전에 컴파일 된 기존 실행 계획과 새 SQL 문을 일치시키는 관계형 엔진의 기능을 향상시킵니다. 쿼리 컴파일 및 재 컴파일 빈도가 줄어들 기 때문에 쿼리 성능이 향상 될 수 있습니다. 쿼리 최적화 프로그램은 MERGE 문에 간단한 매개 변수화 프로세스를 적용하지 않습니다. 따라서 리터럴 값을 포함하는 MERGE 문은 MERGE 문이 실행될 때마다 새 계획이 컴파일되기 때문에 개별 INSERT, UPDATE 또는 DELETE 문만큼 성능이 떨어질 수 있습니다.
쿼리 성능을 향상 시키려면 권장됩니다. 다음 매개 변수화 지침 :
-
ON <merge_search_condition>
절 및WHEN
의 모든 리터럴 값을 매개 변수화합니다. MERGE 문의 절. 예를 들어 MERGE 문을 저장 프로 시저에 통합하여 리터럴 값을 적절한 입력 매개 변수로 바꿀 수 있습니다. - 문을 매개 변수화 할 수없는 경우
TEMPLATE
및 계획 지침에서PARAMETERIZATION FORCED
쿼리 힌트를 지정합니다. - 데이터베이스에서 MERGE 문이 자주 실행되는 경우에는 PARAMETERIZATION 옵션을 데이터베이스를 FORCED로. 이 옵션을 설정할 때주의하십시오.
PARAMETERIZATION
옵션은 데이터베이스 수준 설정이며 데이터베이스에 대한 모든 쿼리가 처리되는 방식에 영향을줍니다.
TOP 조항 모범 사례
MERGE 문에서 TOP 절은 소스 테이블과 대상 테이블이 결합 된 후 삽입, 업데이트 또는 삭제 작업에 적합하지 않은 행이 제거 된 후 영향을받는 행의 수 또는 백분율을 지정합니다. . TOP 절은 조인 된 행의 수를 지정된 값으로 추가로 줄이며 삽입, 업데이트 또는 삭제 작업은 순서가 지정되지 않은 방식으로 나머지 조인 된 행에 적용됩니다. 즉, WHEN 절에 정의 된 조치간에 행이 분배되는 순서가 없습니다. 예를 들어 TOP (10)을 지정하면 10 개의 행에 영향을줍니다. 이 행 중 7 개가 업데이트되고 3 개 삽입되거나 1 개가 삭제되고 5 개가 업데이트되고 4 개가 삽입됩니다.
TOP 절을 사용하여 데이터 조작 언어 (DML)를 수행하는 것이 일반적입니다. ) 대규모 테이블에 대한 일괄 작업. 이를 위해 MERGE 문에서 TOP 절을 사용할 때 다음과 같은 의미를 이해하는 것이 중요합니다.
-
I / O 성능이 영향을받을 수 있습니다.
MERGE 문은 소스 및 대상 테이블 모두의 전체 테이블 스캔을 수행합니다. 작업을 일괄 처리로 나누면 일괄 처리 당 수행되는 쓰기 작업 수가 줄어 듭니다. 그러나 각 배치는 소스 및 대상 테이블의 전체 테이블 스캔을 수행합니다. 결과적인 읽기 활동은 쿼리의 성능에 영향을 미칠 수 있습니다.
-
잘못된 결과가 발생할 수 있습니다.
연속 된 모든 일괄 처리가 새 행을 대상으로하는지 확인하는 것이 중요합니다. 또는 대상 테이블에 중복 행을 잘못 삽입하는 등 원하지 않는 동작이 발생할 수 있습니다. 이는 소스 테이블에 대상 일괄 처리가 아니지만 전체 대상 테이블에있는 행이 포함 된 경우 발생할 수 있습니다.
-
올바른 결과를 얻으려면 다음을 수행하십시오.
- ON 절을 사용하여 기존 대상 행에 영향을주는 원본 행과 실제로 새로운 행을 확인합니다.
- WHEN MATCHED 절에 추가 조건을 사용하여 대상 행이 이미 업데이트되었는지 확인합니다. 이전 배치.
TOP 절은 이러한 절이 적용된 후에 만 적용되기 때문에 각 실행은 실제로 일치하지 않는 행을 삽입하거나 기존 행을 업데이트합니다.
대량로드 모범 사례
MERGE 문은 OPENROWSET(BULK…)
절을 지정하여 소스 데이터 파일의 데이터를 대상 테이블로 효율적으로 대량로드하는 데 사용할 수 있습니다. 테이블 소스로. 이렇게하면 전체 파일이 단일 배치로 처리됩니다.
대량 병합 프로세스의 성능을 개선하려면 다음 지침을 따르는 것이 좋습니다.
-
대상 테이블의 조인 열에 클러스터형 인덱스를 만듭니다.
-
OPENROWSET(BULK…)
절에서 ORDER 및 UNIQUE 힌트를 사용하여 소스 데이터 파일이 정렬되는 방식기본적으로 대량 작업에서는 데이터 파일이 정렬되지 않은 것으로 가정합니다. 따라서 원본 데이터를 대상 테이블의 클러스터형 인덱스에 따라 정렬하고 ORDER 힌트를 사용하여 순서를 표시하여 쿼리 최적화 프로그램이보다 효율적인 쿼리 계획을 생성 할 수 있도록하는 것이 중요합니다. 힌트는 런타임에 유효성이 검사됩니다. 데이터 스트림이 지정된 힌트를 따르지 않으면 오류가 발생합니다.
이러한 지침은 조인 키가 고유하고 데이터의 정렬 순서를 확인합니다. 소스 파일이 대상 테이블과 일치합니다. 추가 정렬 작업이 필요하지 않고 불필요한 데이터 복사가 필요하지 않기 때문에 쿼리 성능이 향상됩니다.
MERGE 성능 측정 및 진단
측정 및 진단에 도움이되는 다음 기능을 사용할 수 있습니다. MERGE 문의 성능.
- sys.dm_exec_query_optimizer_info 동적 관리 뷰의 merge stmt 카운터를 사용하여 MERGE 문의 쿼리 최적화 수를 반환합니다.
- 사용 sys.dm_exec_plan_attributes 동적 관리 뷰의 merge_action_type 속성은 MERGE 문의 결과로 사용 된 트리거 실행 계획의 유형을 반환합니다.
- SQL Trace를 사용하여 MERGE 문의 문제 해결 데이터를 같은 방식으로 수집합니다. 다른 데이터 조작 언어 (DML) 문을 사용합니다. 자세한 내용은 SQL Trace를 참조하십시오.
예
A. MERGE를 사용하여 단일 문으로 테이블에 대한 INSERT 및 UPDATE 작업 수행
일반적인 시나리오는 일치하는 행이있는 경우 테이블에서 하나 이상의 열을 업데이트하는 것입니다. 또는 일치하는 행이없는 경우 데이터를 새 행으로 삽입합니다. 일반적으로 적절한 UPDATE 및 INSERT 문이 포함 된 저장 프로 시저에 매개 변수를 전달하여 두 시나리오 중 하나를 수행합니다. MERGE 문을 사용하면 두 작업을 모두 수행 할 수 있습니다. 다음 예에서는 INSERT 문과 UPDATE 문을 모두 포함하는 AdventureWorks2012 데이터베이스의 저장 프로 시저를 보여줍니다. 그런 다음 단일 MERGE 문을 사용하여 동일한 작업을 실행하도록 프로 시저를 수정합니다.
B . MERGE를 사용하여 단일 문으로 테이블에 대한 UPDATE 및 DELETE 작업 수행
다음 예제에서는 MERGE를 사용하여 AdventureWorks2012 샘플 데이터베이스의 ProductInventory
테이블을 업데이트합니다. 매일, SalesOrderDetail
테이블에서 처리 된 주문을 기반으로합니다. ProductInventory
의 Quantity
열 div> 테이블은
표. 제품 주문 수가 제품의 재고 수준이 0 이하로 떨어지면 해당 제품에 대한 행이ProductInventory
테이블에서 삭제됩니다.
C. MERGE를 사용하여 파생 된 원본 테이블을 사용하여 대상 테이블에서 UPDATE 및 INSERT 작업 수행
다음 예제에서는 MERGE를 사용하여 AdventureWorks2012 데이터베이스의 SalesReason
테이블을 수정합니다. 행을 업데이트하거나 삽입하여. 소스 테이블의 NewName
값이 대상 테이블의 Name
열에있는 값과 일치하면 (SalesReason
), ReasonType
열이 대상 테이블에서 업데이트됩니다. NewName
의 값이 일치하지 않으면 소스 행이 대상 테이블에 삽입됩니다. 소스 테이블은 Transact-SQL 테이블 값 생성자를 사용하여 여러 항목을 지정하는 파생 테이블입니다. 파생 테이블에서 테이블 값 생성자를 사용하는 방법에 대한 자세한 내용은 테이블 값 생성자 (Transact-SQL)를 참조하십시오.이 예에서는 OUTPUT 절의 결과를 테이블 변수에 저장하는 방법도 보여줍니다. 그런 다음 삽입 및 업데이트 된 행 수를 반환하는 간단한 선택 작업을 실행하여 MERGE 문의 결과를 요약합니다.
D.MERGE 문의 결과를 다른 테이블에 삽입
다음 예제는 MERGE 문의 OUTPUT 절에서 반환 된 데이터를 캡처하고 해당 데이터를 다른 테이블에 삽입합니다. MERGE 문은 iv id =에서 처리 된 주문에 따라 AdventureWorks2012 데이터베이스에있는 ProductInventory
테이블의 Quantity
열을 업데이트합니다. “2a11432756”> 표. 이 예는 업데이트 된 행을 캡처하여 인벤토리 변경을 추적하는 데 사용되는 다른 테이블에 삽입합니다.
E. MERGE를 사용하여 INSERT 또는 UPDATE 수행 그래프 데이터베이스의 대상 에지 테이블
이 예에서는 노드 테이블 Person
및 City
및 가장자리 테이블 livesIn
. livesIn
가장자리에 MERGE 문을 사용하고 가장자리가 이미 존재하지 않는 경우 새 행을 삽입합니다. Person
및 City
. 에지가 이미있는 경우 livesIn
에지에서 StreetAddress 속성 만 업데이트하면됩니다.