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 触发器的趣事。