Вмъкването във временни таблици, индексирани в свързващите колони, може да подобри нещата като 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