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에서이 추가 삽입을 얻는 이유는 무엇입니까?