Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Join lento su tabelle trigger inserite/eliminate

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