MERGE는 tempdb를 사용합니까?


12

다음 쿼리를 고려하십시오.

MERGE [Parameter] with (rowlock) AS target
    USING (SELECT @AreaId, @ParameterTypeId, @Value)
            AS source (AreaId, ParameterTypeId, Value)
    ON (target.AreaId = source.AreaId AND 
        target.ParameterTypeId = source.ParameterTypeId)
    WHEN MATCHED THEN 
        UPDATE SET target.Value = source.Value, @UpdatedId = target.Id
    WHEN NOT MATCHED THEN
        INSERT ([AreaId], [ParameterTypeId], [Value])
        VALUES (source.AreaId, source.ParameterTypeId, source.Value);

통계 I / O는 다음과 같은 출력을 제공합니다.

'ParameterType'테이블. 스캔 횟수 0, 논리적 읽기 2, 물리적 읽기 0, 미리 읽기 0, lob 논리적 읽기 0, lob 물리적 읽기 0, lob 미리 읽기 0.
표 'Area'. 스캔 카운트 0, 논리적 읽기 2, 물리적 읽기 0, 미리 읽기 0, lob 논리적 읽기 0, lob 물리적 읽기 0, lob 미리 읽기 0.
테이블 '매개 변수'. 스캔 횟수 1, 논리적 읽기 4, 물리적 읽기 0, 미리 읽기 0, lob 논리적 읽기 0, lob 물리적 읽기 0, lob 미리 읽기 0.
테이블 '작업 테이블'. 스캔 횟수 1, 논리적 읽기 0, 물리적 읽기 0, 미리 읽기 0, lob 논리적 읽기 0, lob 물리적 읽기 0, lob 미리 읽기 0

메시지 테이블에 작업 테이블이 나타나서 tempdb가 사용 중이라고 생각합니다 MERGE.

실행 계획에 tempdb가 필요하다는 것을 나타내는 내용이 없습니다.

MERGE항상 tempdb를 사용 합니까 ?

BOL에이 동작을 설명하는 내용이 있습니까?

이 상황에서 사용 INSERT하고 UPDATE더 빠를까요?

왼쪽

여기에 이미지 설명을 입력하십시오

권리

여기에 이미지 설명을 입력하십시오

다음은 테이블 구조입니다

여기에 이미지 설명을 입력하십시오


계획의 스풀은의 작업 테이블입니다 tempdb. 그래도 단일 행에 대해 이상하게 보입니다. 할로윈 보호를 위해있을 수 있습니다.
Martin Smith

나는 지금 본다. 되감기를 최적화하기 위해 입력의 데이터를 임시 테이블에 저장합니다.
Craig Efrein

답변:


8

(질문에 대한 내 의견을 확장합니다.)

AreaIdand 의 조합에 대한 고유 한 제한이 없으면 ParameterTypeId주어진 코드는 @UpdatedId = target.Id단 하나의 행만 기록 하기 때문에 깨집니다 Id.

그렇게하지 않으면 SQL Server는 데이터의 가능한 상태를 암시 적으로 알 수 없습니다. 제약 조건을 적용하거나 여러 행이 유효한 경우 Id값 을 출력하기 위해 다른 메커니즘을 사용하도록 코드를 변경해야 합니다.

스캔 연산자가 여러 개의 일치하는 행을 발견 할 수 있으므로 쿼리는 할로윈 보호를 위해 모든 일치 항목을 스풀링해야합니다. 주석에 표시된 것처럼 제약 조건 유효하므로 추가하면 계획이 검색에서 검색으로 변경 될뿐만 아니라 SQL Server에서 0 또는 seek 연산자에서 1 개의 행이 반환되었습니다.


6

업데이트가 업데이트로 스캔 한 인덱스에서 행의 위치를 ​​변경할 수있는 경우 SQL Server는 Halloween Problem 으로부터 보호해야합니다 . 이를 위해 SQL Server는 일반적으로 인덱스 스캔 직후 열망 테이블 스풀을 실행 계획에 삽입합니다. 이 연산자는 기본적으로 해당 행의 복사본을 만들고 tempdb를 사용합니다.

MERGE 문의 업데이트 부분은 동일한 규칙을 따라야하며 할로윈 보호가 필요한 대부분의 경우 테이블 스풀도 사용합니다.

인덱스 정의를 모르기 때문에 쿼리에서 이것이 사실인지 알 수는 없지만 여기서 일어날 가능성이 높습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.