INSTEAD OF UPDATE 트리거가있는 테이블에 대한 UPDATE가 클러스터형 인덱스 삽입뿐만 아니라 클러스터형 인덱스 삽입을 수행하는 이유는 무엇입니까?


10

PK에 클러스터 된 동일한 스키마를 가진 두 개의 테이블이 있지만 그 중 하나에 INSTEAD OF UPDATE트리거 가있는 두 개의 테이블로 시작 합니다.

CREATE TABLE Standard
(
    PK  UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED,
    V   INT NOT NULL
)
GO

CREATE TABLE InsteadOf
(
    PK  UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED,
    V   INT NOT NULL
)
GO

INSERT Standard (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0)
INSERT InsteadOf (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0)
GO

CREATE TRIGGER TR_InsteadOf_Update ON InsteadOf INSTEAD OF UPDATE
AS
BEGIN
    DECLARE @PK UNIQUEIDENTIFIER
    DECLARE @V INT
    DECLARE @cursor CURSOR
    SET @cursor = CURSOR FOR SELECT PK, V FROM Inserted
    OPEN @cursor

    FETCH NEXT FROM @cursor INTO @PK, @V
    WHILE @@FETCH_STATUS = 0
    BEGIN
        UPDATE InsteadOf SET
            V = @V
        WHERE PK = @PK

        FETCH NEXT FROM @cursor INTO @PK, @V
    END
    CLOSE @cursor
    DEALLOCATE @cursor

END
GO

표준 테이블에 대한 업데이트에 대한 쿼리 계획을 보면 예상되는 클러스터 인덱스 업데이트가 나타납니다.

UPDATE Standard SET
    V = 1
    WHERE PK = '1E58B555-B073-471E-B576-4B09C8E18976'

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

그러나 트리거를 사용하여 테이블에 대해 비슷한 업데이트를 수행하면 클러스터형 인덱스 업데이트뿐만 아니라 클러스터형 인덱스 삽입으로 보이는 것이 나타납니다.

UPDATE InsteadOf SET
    V = 1
    WHERE PK = '1E58B555-B073-471E-B576-4B09C8E18976'

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

왜 이런거야? 이 쿼리 계획 (쿼리 # 4)에서 나중에 예상되는 클러스터형 인덱스 업데이트를 볼 수 있지만 쿼리 # 1에서이 추가 삽입을 얻는 이유는 무엇입니까?

답변:


10

INSTEAD OF트리거 저장 숨겨진 작업 테이블 *에 영향을받는 행의 복사본. 이것이 보이는 Clustered Index Insert입니다. 트리거 본문은이 작업 테이블 *에서 읽으며 트리거의 모든 데이터 변경에는 '정상'연산자 (예 : 클러스터 인덱스 업데이트)가 사용됩니다.


* 조회 프로세서는 사용자가 볼 수있는 실행 계획 양식을 구성 할 때 내부적으로 작업 테이블의 이름을 바꿉니다. 읽을 때 그것을 쓸 때,이 목표 기본 테이블로 이름이 변경되고, 그것은으로 이름이 변경 inserted또는 deleted더 많거나 적은 사람들이 트리거에서 볼 기대한다.

자세한 내용은 내 기사 INSTEAD OF 트리거에 대한 흥미로운 내용을 참조하십시오 .

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