Sql-Server

為什麼對我的分區視圖執行刪除會導致聚集索引插入?

  • July 29, 2017

我有一個分區視圖,它具有以下插入觸發器(可憐的 mans 分區)。當我執行 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'

…. 等等

INSTEAD OFtriggers 完全取代了觸發動作。

插入刪除的偽表表示如果觸發語句實際執行,將會進行的更改。行版本控制不能用於這些觸發器,因為根據定義,尚未發生任何修改。

INSTEAD OF當觸發器存在時,SQL Server 會修改觸發 DML 語句的執行計劃。執行計劃不是直接修改受影響的表,而是將有關更改的資訊寫入隱藏的工作表。

此工作表包含執行原始更改所需的所有數據、對每行執行的修改類型(刪除或插入)以及OUTPUT子句觸發器中所需的任何資訊。

執行計劃中的 Insert 表示寫入這個隱藏的工作表。當您擷取語句的執行後計劃時,您將看到這個隱藏的工作表被用作刪除插入的偽表。

請參閱我的 SQLPerformance.com 文章,關於 INSTEAD OF 觸發器的有趣事情

引用自:https://dba.stackexchange.com/questions/182154