Por que a exclusão de uma exibição particionada resulta em uma inserção de índice em cluster?

9

Eu tenho uma exibição particionada que possui o gatilho de inserção abaixo (partição pobre do homem). Quando executo um DELETE, recebo o plano de consulta abaixo:

delete from factproductprice where pricedate = '20170725'

insira a descrição da imagem aqui

Disparar na exibição:

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

Bloquear
fonte

Respostas:

11

INSTEAD OF os gatilhos substituem completamente a ação de disparo.

As pseudo-tabelas inseridas e excluídas representam as mudanças que teriam sido feitas, se a instrução de acionamento fosse realmente executada. O controle de versão de linha não pode ser usado para esses gatilhos porque ainda não ocorreram modificações, por definição.

O SQL Server modifica o plano de execução da instrução DML de acionamento quando INSTEAD OFexiste um acionador. Em vez de modificar diretamente as tabelas afetadas, o plano de execução grava informações sobre as alterações em uma tabela de trabalho oculta.

Esta tabela de trabalho contém todos os dados necessários para executar as alterações originais, o tipo de modificação a ser executada em cada linha (excluir ou inserir), bem como todas as informações necessárias no acionador de uma OUTPUTcláusula.

A inserção no seu plano de execução representa a gravação nesta mesa de trabalho oculta. Ao capturar um plano de pós-execução para a instrução, você verá esta tabela de trabalho oculta sendo usada como pseudo-tabelas excluídas e inseridas .

Veja meu artigo do SQLPerformance.com, Coisas interessantes sobre INSTEAD OF Triggers .

Paul White 9
fonte