L'inserimento in tabelle temporanee indicizzate sulle colonne di unione potrebbe migliorare le cose come inserted
e deleted
non sono indicizzati.
Puoi controllare @@ROWCOUNT
all'interno del trigger in modo da eseguire questa logica solo al di sopra di un certo numero di righe soglia, anche se in SQL Server 2008 ciò potrebbe sovrastimare in qualche modo il numero se il trigger è stato attivato come risultato di un MERGE
istruzione (Restituirà il numero totale di righe interessate da tutti i MERGE
azioni non solo quella rilevante per quel trigger specifico).
In tal caso puoi semplicemente fare qualcosa come SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T
per vedere se la soglia viene raggiunta.
Aggiunta
Un'altra possibilità che potresti sperimentare è semplicemente bypassare il trigger per questi grandi aggiornamenti. Potresti usare SET CONTEXT_INFO
per impostare un flag e verificarne il valore all'interno del trigger. È quindi possibile utilizzare OUTPUT inserted.*, deleted.*
per ottenere i valori "prima" e "dopo" per una riga senza dover JOIN
affatto.
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