Indsættelse i midlertidige tabeller indekseret på sammenføjningskolonnerne kunne meget vel forbedre tingene som inserted og deleted er ikke indekseret.
Du kan tjekke @@ROWCOUNT inde i triggeren, så du kun udfører denne logik over et tærskeltal af rækker, selvom dette på SQL Server 2008 kan overdrive tallet en smule, hvis triggeren blev udløst som et resultat af en MERGE sætning (Det vil returnere det samlede antal rækker, der er påvirket af alle MERGE handlinger, ikke kun den, der er relevant for den specifikke trigger).
I så fald kan du bare gøre noget som SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T for at se, om tærsklen er nået.
Tilføjelse
En anden mulighed, du kan eksperimentere med, er simpelthen at omgå triggeren for disse store opdateringer. Du kan bruge SET CONTEXT_INFO for at indstille et flag og kontrollere værdien af dette inde i triggeren. Du kan derefter bruge OUTPUT inserted.*, deleted.* for at få "før" og "efter" værdierne for en række uden at skulle JOIN overhovedet.
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