Perché eseguire un'eliminazione sulla mia vista partizionata si traduce in un inserto di indice cluster?


9

Ho una vista partizionata che ha il trigger di inserimento sotto (partizione mans scarsa). Quando eseguo un ELIMINA, ottengo il piano di query seguente:

delete from factproductprice where pricedate = '20170725'

inserisci qui la descrizione dell'immagine

Trigger sulla vista:

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'

.... eccetera

Risposte:


11

INSTEAD OF i trigger sostituiscono completamente l'azione di trigger.

Le pseudo-tabelle inserite ed eliminate rappresentano le modifiche che sarebbero state apportate se l'istruzione di trigger fosse stata effettivamente eseguita. Il versioning delle righe non può essere utilizzato per questi trigger perché non sono ancora state apportate modifiche, per definizione.

SQL Server modifica il piano di esecuzione per l'attivazione dell'istruzione DML quando INSTEAD OFesiste un trigger. Anziché modificare direttamente le tabelle interessate, il piano di esecuzione scrive le informazioni sulle modifiche in un piano di lavoro nascosto.

Questo worktable contiene tutti i dati necessari per eseguire le modifiche originali, il tipo di modifica da eseguire su ciascuna riga (elimina o inserisci), nonché tutte le informazioni necessarie nel trigger per una OUTPUTclausola.

L'Insert nel piano di esecuzione rappresenta la scrittura su questo piano di lavoro nascosto. Quando acquisisci un piano di post-esecuzione per l'istruzione, vedrai questo worktable nascosto utilizzato come pseudo-tabelle eliminate e inserite .

Vedi il mio articolo su SQLPerformance.com, cose interessanti su INSTEAD OF Trigger .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.