Pourquoi la suppression d'une vue partitionnée entraîne-t-elle une insertion d'index en cluster?

9

J'ai une vue partitionnée qui a le déclencheur d'insertion ci-dessous (mauvaise partition mans). Lorsque j'effectue une suppression, j'obtiens le plan de requête ci-dessous:

delete from factproductprice where pricedate = '20170725'

entrez la description de l'image ici

Déclenchement sur la vue:

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'

.... etc

Fermer à clé
la source

Réponses:

11

INSTEAD OF les déclencheurs remplacent complètement l'action de déclenchement.

Les pseudo-tables insérées et supprimées représentent des modifications qui auraient été apportées si l'instruction de déclenchement avait été exécutée. La version en ligne ne peut pas être utilisée pour ces déclencheurs car aucune modification n'a encore eu lieu, par définition.

SQL Server modifie le plan d'exécution de l'instruction de déclenchement DML lorsqu'un INSTEAD OFdéclencheur existe. Plutôt que de modifier directement les tables affectées, le plan d'exécution écrit des informations sur les modifications apportées à une table de travail masquée.

Cette table de travail contient toutes les données nécessaires pour effectuer les modifications d'origine, le type de modification à effectuer sur chaque ligne (supprimer ou insérer), ainsi que toutes les informations nécessaires dans le déclencheur d'une OUTPUTclause.

L'insertion dans votre plan d'exécution représente l'écriture dans cette table de travail cachée. Lorsque vous capturez un plan de post-exécution pour l'instruction, vous verrez cette table de travail cachée utilisée comme pseudo-tables supprimées et insérées .

Voir mon article SQLPerformance.com, Choses intéressantes sur INSTEAD OF Triggers .

Paul White 9
la source