Warum führt das Löschen meiner partitionierten Ansicht zu einem Clustered Index Insert?

9

Ich habe eine partitionierte Ansicht, die den folgenden Einfügetrigger hat (Partition des schlechten Mannes). Wenn ich ein LÖSCHEN durchführe, erhalte ich den folgenden Abfrageplan:

delete from factproductprice where pricedate = '20170725'

Geben Sie hier die Bildbeschreibung ein

Auslöser für die Ansicht:

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'

.... usw

Sperren
quelle

Antworten:

11

INSTEAD OF Trigger ersetzen die Triggeraktion vollständig.

Die eingefügten und gelöschten Pseudotabellen stellen Änderungen dar, die vorgenommen worden wären, wenn die auslösende Anweisung tatsächlich ausgeführt worden wäre. Die Zeilenversionierung kann für diese Trigger nicht verwendet werden, da per Definition noch keine Änderungen vorgenommen wurden.

SQL Server ändert den Ausführungsplan für die auslösende DML-Anweisung, wenn ein INSTEAD OFTrigger vorhanden ist. Anstatt die betroffenen Tabellen direkt zu ändern, schreibt der Ausführungsplan Informationen über die Änderungen in eine versteckte Arbeitstabelle.

Diese Arbeitstabelle enthält alle Daten, die zum Ausführen der ursprünglichen Änderungen erforderlich sind, die Art der Änderung, die für jede Zeile durchgeführt werden muss (Löschen oder Einfügen), sowie alle Informationen, die im Auslöser für eine OUTPUTKlausel erforderlich sind .

Das Einfügen in Ihren Ausführungsplan stellt das Schreiben in diesen versteckten Arbeitstisch dar. Wenn Sie einen Plan nach der Ausführung für die Anweisung erfassen, wird diese versteckte Arbeitstabelle als gelöschte und eingefügte Pseudotabelle verwendet.

Siehe meinen SQLPerformance.com-Artikel, Interessante Dinge über STATT Trigger .

Paul White 9
quelle