Dlaczego usunięcie w widoku podzielonym na partycje powoduje wstawienie indeksu klastrowanego?

9

Mam widok podzielony na partycje, który ma poniżej wyzwalacza wstawiania (słaba partycja mans). Kiedy wykonuję DELETE, otrzymuję poniższy plan zapytań:

delete from factproductprice where pricedate = '20170725'

wprowadź opis zdjęcia tutaj

Uruchom na widoku:

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'

.... itd

Zamek
źródło

Odpowiedzi:

11

INSTEAD OF wyzwalacze całkowicie zastępują działanie wyzwalające.

W wstawione i usunięte pseudo-tabele przedstawiają zmiany, które zostały dokonane, gdyby oświadczenie wyzwalania faktycznie wykonywane. Wersji wiersza nie można użyć dla tych wyzwalaczy, ponieważ z definicji nie nastąpiły jeszcze żadne modyfikacje.

SQL Server modyfikuje plan wykonania dla wyzwalającej instrukcji DML, gdy INSTEAD OFistnieje wyzwalacz. Zamiast bezpośrednio modyfikować tabele, których dotyczy problem, plan wykonania zapisuje informacje o zmianach w ukrytym stole roboczym.

Ten stół roboczy zawiera wszystkie dane potrzebne do wykonania pierwotnych zmian, rodzaj modyfikacji do wykonania w każdym wierszu (usunięcie lub wstawienie), a także wszelkie informacje potrzebne w wyzwalaczu dla OUTPUTklauzuli.

Wstaw w twoim planie wykonania reprezentuje zapis do tego ukrytego stołu roboczego. Podczas przechwytywania planu po wykonaniu dla instrukcji zobaczysz ten ukryty stół roboczy używany jako usunięte i wstawione pseudo-tabele.

Zobacz mój artykuł SQLPerformance.com, Interesujące rzeczy na temat INSTEAD OF Trigger .

Paul White 9
źródło