Почему выполнение удаления моего многораздельного представления приводит к вставке кластерного индекса?

9

У меня есть разделенное представление, которое имеет ниже триггер вставки (плохой раздел man). Когда я выполняю DELETE, я получаю следующий план запроса:

delete from factproductprice where pricedate = '20170725'

введите описание изображения здесь

Триггер на виде:

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'

.... так далее

Замок
источник

Ответы:

11

INSTEAD OF Триггеры полностью заменяют триггерное действие.

В вставленных и удаленных псевдо-таблицах представляют собой изменения , которые были сделаны, были триггера на самом деле выполнены. Версионирование строк не может использоваться для этих триггеров, потому что по определению никаких изменений еще не произошло.

SQL Server изменяет план выполнения для запускающего оператора DML, когда INSTEAD OFсуществует триггер. Вместо непосредственного изменения затронутых таблиц план выполнения записывает информацию об изменениях в скрытый рабочий стол.

Этот рабочий стол содержит все данные, необходимые для выполнения исходных изменений, тип изменения, выполняемого в каждой строке (удаление или вставка), а также любую информацию, необходимую в триггере для OUTPUTпредложения.

Вставка в вашем плане выполнения представляет запись в этот скрытый рабочий стол. При захвате плана после выполнения для оператора вы увидите, что этот скрытый рабочий стол используется в качестве удаленных и вставленных псевдотаблиц.

Смотрите мою статью на SQLPerformance.com, Интересные вещи о триггерах INSTEAD OF .

Пол Уайт 9
источник