Invoegen in tijdelijke tabellen die zijn geïndexeerd op de samenvoegende kolommen kan de zaken verbeteren zoals inserted
en deleted
zijn niet geïndexeerd.
U kunt @@ROWCOUNT
. controleren binnen de trigger, zodat u deze logica alleen boven een bepaald drempelaantal rijen uitvoert, hoewel dit op SQL Server 2008 het aantal enigszins kan overdrijven als de trigger is geactiveerd als gevolg van een MERGE
statement (Het retourneert het totale aantal rijen beïnvloed door alle MERGE
acties die niet alleen relevant zijn voor die specifieke trigger).
In dat geval kun je gewoon iets doen als SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T
om te zien of de drempel is bereikt.
Toevoeging
Een andere mogelijkheid waarmee u kunt experimenteren, is simpelweg de trigger voor deze grote updates omzeilen. Je zou SET CONTEXT_INFO
. kunnen gebruiken om een vlag in te stellen en de waarde hiervan in de trigger te controleren. U kunt dan OUTPUT inserted.*, deleted.*
om de "before" en "after" waarden voor een rij te krijgen zonder JOIN
te hoeven gebruiken helemaal niet.
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