Sql-Server
為什麼對我的分區視圖執行刪除會導致聚集索引插入?
我有一個分區視圖,它具有以下插入觸發器(可憐的 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 OF
triggers 完全取代了觸發動作。插入和刪除的偽表表示如果觸發語句實際執行,將會進行的更改。行版本控制不能用於這些觸發器,因為根據定義,尚未發生任何修改。
INSTEAD OF
當觸發器存在時,SQL Server 會修改觸發 DML 語句的執行計劃。執行計劃不是直接修改受影響的表,而是將有關更改的資訊寫入隱藏的工作表。此工作表包含執行原始更改所需的所有數據、對每行執行的修改類型(刪除或插入)以及
OUTPUT
子句觸發器中所需的任何資訊。執行計劃中的 Insert 表示寫入這個隱藏的工作表。當您擷取語句的執行後計劃時,您將看到這個隱藏的工作表被用作刪除和插入的偽表。
請參閱我的 SQLPerformance.com 文章,關於 INSTEAD OF 觸發器的有趣事情。