분할 된 뷰에서 삭제를 수행하면 클러스터형 인덱스 삽입이 발생하는 이유는 무엇입니까?


9

아래 삽입 트리거가있는 파티션보기가 있습니다 (가난한 파티션). DELETE를 수행하면 아래 쿼리 계획이 나타납니다.

delete from factproductprice where pricedate = '20170725'

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

보기에서 트리거하십시오.

ALTER TRIGGER [dbo].[factProductPriceDelete] ON [dbo].[FactProductPrice]
INSTEAD OF DELETE AS
BEGIN
  IF @@ROWCOUNT = 0 RETURN;

  DECLARE @PriceDate DATE
  SELECT @PriceDate = CAST(PriceDate AS DATE) FROM DELETED
  IF @PriceDate BETWEEN '20140101' AND '20141231'
  BEGIN
    DELETE FROM dbo.FactProductPrice2014
    WHERE ProductId IN (SELECT ProductId FROM DELETED) AND SalesPriceSchemeId IN (SELECT SalesPriceSchemeId FROM DELETED) AND PriceDate IN (SELECT PriceDate FROM DELETED) 
  END
  IF @PriceDate BETWEEN '20150101' AND '20151231'
  BEGIN
    DELETE FROM dbo.FactProductPrice2015
    WHERE ProductId IN (SELECT ProductId FROM DELETED) AND SalesPriceSchemeId IN (SELECT SalesPriceSchemeId FROM DELETED) AND PriceDate IN (SELECT PriceDate FROM DELETED) 
  END
  IF @PriceDate BETWEEN '20160101' AND '20161231'

.... 등

답변:


11

INSTEAD OF 트리거는 트리거 조치를 완전히 대체합니다.

삽입삭제 된 의사 테이블이 만들어진 것이다 변화를 나타내고, 트리거 문이 실제로 실행했다. 정의에 따라 수정이 아직 발생하지 않았으므로 이러한 트리거에 행 버전을 사용할 수 없습니다.

SQL Server는 다음과 같은 경우 트리거 DML 문의 실행 계획을 수정합니다. INSTEAD OF 트리거가 합니다. 영향을받는 테이블을 직접 수정하는 대신 실행 계획은 변경에 대한 정보를 숨겨진 작업 테이블에 씁니다.

이 작업 테이블에는 원래 변경을 수행하는 데 필요한 모든 데이터, 각 행에서 수행 할 수정 유형 (삭제 또는 삽입) 및 OUTPUT절 트리거에 필요한 정보가 포함됩니다 .

실행 계획의 삽입은이 숨겨진 작업 테이블에 쓰는 것을 나타냅니다. 명령문에 대한 사후 실행 계획을 캡처하면이 숨겨진 작업 테이블이 삭제삽입 된 의사 테이블로 사용되는 것을 볼 수 있습니다.

내 SQLPerformance.com 기사, INSTEAD OF 트리거에 대한 흥미로운 것들을 참조하십시오 .

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