插入到加入列索引的临时表中可以改善事情,因为inserted
和deleted
未编制索引。
您可以检查@@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? –
@Martin - 这是2005年,我刚更新了标签以反映这一点。 –