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