Att infoga i temporära tabeller indexerade på sammanfogningskolumnerna kan mycket väl förbättra saker som inserted
och deleted
är inte indexerade.
Du kan kontrollera @@ROWCOUNT
inuti triggern så att du bara utför denna logik över ett tröskelvärde för antal rader, men på SQL Server 2008 kan detta överdriva siffran något om triggern avfyrades som ett resultat av en MERGE
uttalande (Det kommer att returnera det totala antalet rader som påverkas av alla MERGE
åtgärder som inte bara är relevanta för den specifika utlösaren).
I så fall kan du bara göra något i stil med SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T
för att se om tröskeln är uppfylld.
Tillägg
En annan möjlighet du kan experimentera med är att helt enkelt kringgå triggern för dessa stora uppdateringar. Du kan använda SET CONTEXT_INFO
för att ställa in en flagga och kontrollera värdet på denna inuti triggern. Du kan sedan använda OUTPUT inserted.*, deleted.*
för att få värdena "före" och "efter" för en rad utan att behöva JOIN
överhuvudtaget.
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