我们有一个触发器,可以为表创建审计记录,并加入inserted
和deleted
表,以查看是否有任何列已更改。连接一直适用于小型设备,但现在我正在更新大约100万行,并且它在几天内没有完成。我尝试更新具有不同数量级的选定行数,显然这是指数级的,如果正在扫描inserted
/ deleted
表以进行连接,这将是有意义的。
我尝试创建索引但得到错误:
Cannot find the object "inserted" because it does not exist or you do not have permissions.
有没有办法让这更快?
答案 0 :(得分:4)
如果inserted
和deleted
未编入索引,那么插入加入列的索引临时表可能会有所改进。
您可以检查触发器内的@@ROWCOUNT
,这样您只能在某些阈值行数上执行此逻辑,尽管在SQL Server 2008上,如果触发器因{{1}而触发,这可能会略微夸大数字}}语句(它将返回受所有MERGE
操作影响的行总数,而不仅仅是与该特定触发器相关的行。)
在这种情况下,您可以执行类似MERGE
的操作,以查看是否符合阈值。
<强>加成强>
您可以尝试的另一种可能性就是绕过这些大型更新的触发器。您可以使用SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T
设置标志并检查触发器内的值。然后,您可以使用SET CONTEXT_INFO
获取行的“之前”和“之后”值,而无需OUTPUT inserted.*, deleted.*
。
JOIN