gpt4 book ai didi

sql-server-2005 - 插入/删除触发器表的缓慢连接

转载 作者:行者123 更新时间:2023-12-04 07:01:34 26 4
gpt4 key购买 nike

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

我尝试创建索引但出现错误:找不到“插入”的对象,因为它不存在或您没有权限。

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

最佳答案

插入到在连接列上索引的临时表中可以很好地改善inserteddeleted 没有索引的情况。

您可以检查触发器内部的 @@ROWCOUNT,这样您就可以只在超出某个阈值行数的情况下执行此逻辑,尽管在 SQL Server 2008 上,如果触发器作为结果被触发,这可能会稍微夸大该数字MERGE 语句(它将返回受所有 MERGE 操作影响的总行数,而不仅仅是与该特定触发器相关的行)。

在这种情况下,您可以执行类似 SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T 的操作来查看是否达到阈值。

添加

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

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

关于sql-server-2005 - 插入/删除触发器表的缓慢连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7747986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com