在Inserted / Deleted触发器表上缓慢连接

时间:2011-10-13 00:03:33

标签: sql-server-2005 triggers

我们有一个触发器,可以为表创建审计记录,并加入inserteddeleted表,以查看是否有任何列已更改。连接一直适用于小型设备,但现在我正在更新大约100万行,并且它在几天内没有完成。我尝试更新具有不同数量级的选定行数,显然这是指数级的,如果正在扫描inserted / deleted表以进行连接,这将是有意义的。

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

有没有办法让这更快?

1 个答案:

答案 0 :(得分:4)

如果inserteddeleted未编入索引,那么插入加入列的索引临时表可能会有所改进。

您可以检查触发器内的@@ROWCOUNT,这样您只能在某些阈值行数上执行此逻辑,尽管在SQL Server 2008上,如果触发器因{{1}而触发,这可能会略微夸大数字}}语句(它将返回受所有MERGE操作影响的行总数,而不仅仅是与该特定触发器相关的行。)

在这种情况下,您可以执行类似MERGE的操作,以查看是否符合阈值。

<强>加成

您可以尝试的另一种可能性就是绕过这些大型更新的触发器。您可以使用SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T设置标志并检查触发器内的值。然后,您可以使用SET CONTEXT_INFO获取行的“之前”和“之后”值,而无需OUTPUT inserted.*, deleted.*

JOIN