为什么在我的分区视图上执行删除会导致聚集索引插入?

Loc*_*ock 9 trigger sql-server execution-plan partitioning sql-server-2014

我有一个分区视图,其中包含以下插入触发器(可怜的 mans 分区)。当我执行 DELETE 时,我得到以下查询计划:

delete from factproductprice where pricedate = '20170725'
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在视图上触发:

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'
Run Code Online (Sandbox Code Playgroud)

.... 等等

Pau*_*ite 11

INSTEAD OF 触发器完全取代了触发动作。

插入删除的伪表表示将已进行了更改,有触发语句实际执行。根据定义,行版本控制不能用于这些触发器,因为尚未发生任何修改。

INSTEAD OF触发器存在时,SQL Server 会修改触发 DML 语句的执行计划。执行计划不是直接修改受影响的表,而是将有关更改的信息写入隐藏的工作表。

此工作表包含执行原始更改所需的所有数据、对每一行执行的修改类型(删除或插入),以及OUTPUT子句触发器中所需的任何信息。

执行计划中的 Insert 表示写入此隐藏工作表。当您捕获语句的执行后计划时,您将看到这个隐藏的工作表被用作删除插入的伪表。

请参阅我的 SQLPerformance.com 文章,关于 INSTEAD OF 触发器的趣事。