插入到加入列索引的臨時表中可以改善事情,因爲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年,我剛更新了標籤以反映這一點。 –