插入/删除触发器表上的慢连接

2024-01-21

我们有一个触发器,可以为表创建审计记录并连接inserted and deleted表以查看是否有任何列已更改。连接对于小型集合一直运行良好,但现在我要更新大约 100 万行,并且几天之内就不会完成。我尝试更新具有不同数量级的选定行数,很明显这是指数级的,如果inserted/deleted正在扫描表以进行连接。

我尝试创建索引但收到错误:Cannot find the object "inserted" because it does not exist or you do not have permissions.

有什么办法可以让它更快吗?


插入到在连接列上建立索引的临时表可以很好地改善情况:inserted and deleted未编入索引。

你可以检查@@ROWCOUNT因此,您只能在行数超过某个阈值时执行此逻辑,但在 SQL Server 2008 上,如果触发器是由于以下原因而触发的,则可能会夸大该数字:MERGE语句(它将返回受所有语句影响的总行数MERGE操作不仅仅是与该特定触发器相关的操作)。

在这种情况下你可以做类似的事情SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T查看是否达到阈值。

Addition

您可以尝试的另一种可能性是简单地绕过这些大型更新的触发器。你可以使用SET CONTEXT_INFO设置一个标志并检查触发器内的值。然后你可以使用OUTPUT inserted.*, deleted.*获取一行的“之前”和“之后”值,而无需JOIN at all.

DECLARE @TriggerFlag varbinary(128)
SET @TriggerFlag = CAST('Disabled' AS varbinary(128)) 

SET CONTEXT_INFO @TriggerFlag

UPDATE YourTable
SET Bar = 'X'
OUTPUT inserted.*, deleted.* INTO @T

/*Reset the flag*/
SET CONTEXT_INFO 0x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

插入/删除触发器表上的慢连接 的相关文章

随机推荐