2011-10-13 67 views
3

我们有一个表中创建审计记录并加入inserteddeleted表,看是否有列已经改变了触发。这个连接对于小集合来说一直运行良好,但是现在我正在更新大约100万行,并且在几天内还没有完成。我试着更新与不同量级行的选择数量,很明显这是指数,这将使意义,如果inserted/deleted表扫描做加盟。缓慢加入所插入/删除触发器表

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

有什么办法,使这个得更快?

+0

我只是想选择每个这些到新的临时表,之后我应该能够创建索引。不过,我也关注对个人记录的性能,这似乎矫枉过正那些。 –

+0

什么版本的SQL Server? –

+0

@Martin - 这是2005年,我刚更新了标签以反映这一点。 –

回答

4

插入到加入列索引的临时表中可以改善事情,因为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 
+0

设置阈值的重点。这可能会让触发器变得非常复杂,但我认为对任何事情都有权衡。我仍然对一件事情感到困惑:我们有另一个几乎相同的数据库,它没有经历这种放缓。表,触发器和索引似乎是相同的,但我还没有做过详细的比较。 –