¿Por qué realizar una eliminación en mi vista particionada resulta en una inserción de índice agrupado?

9

Tengo una vista particionada que tiene el siguiente desencadenador de inserción (partición pobre del hombre). Cuando realizo una ELIMINACIÓN, obtengo el siguiente plan de consulta:

delete from factproductprice where pricedate = '20170725'

ingrese la descripción de la imagen aquí

Disparador en la 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'

.... etc.

Bloquear
fuente

Respuestas:

11

INSTEAD OF los disparadores reemplazan completamente la acción disparadora.

Las pseudo-tablas insertadas y eliminadas representan los cambios que se habrían realizado si la declaración de activación se hubiera ejecutado realmente. El control de versiones de fila no se puede utilizar para estos desencadenantes porque todavía no se han producido modificaciones, por definición.

SQL Server modifica el plan de ejecución para la instrucción DML desencadenante cuando INSTEAD OFexiste un desencadenador. En lugar de modificar directamente las tablas afectadas, el plan de ejecución escribe información sobre los cambios en una tabla de trabajo oculta.

Esta tabla de trabajo contiene todos los datos necesarios para realizar los cambios originales, el tipo de modificación a realizar en cada fila (eliminar o insertar), así como cualquier información necesaria en el activador de una OUTPUTcláusula.

La inserción en su plan de ejecución representa escribir en esta mesa de trabajo oculta. Cuando capture un plan posterior a la ejecución de la instrucción, verá que esta tabla de trabajo oculta se utiliza como pseudo-tablas eliminadas e insertadas .

Consulte mi artículo de SQLPerformance.com, Cosas interesantes sobre INSTEAD OF Triggers .

Paul White 9
fuente