Das Einfügen in temporäre Tabellen, die auf den Verbindungsspalten indexiert sind, könnte die Dinge als inserted
verbessern und deleted
sind nicht indiziert.
Sie können @@ROWCOUNT
überprüfen innerhalb des Triggers, sodass Sie diese Logik nur oberhalb einer bestimmten Schwellenwertanzahl von Zeilen ausführen, obwohl dies auf SQL Server 2008 die Zahl etwas überbewerten könnte, wenn der Trigger als Ergebnis eines MERGE
ausgelöst wurde -Anweisung (Sie gibt die Gesamtzahl der Zeilen zurück, die von allen MERGE
betroffen sind Aktionen, nicht nur die, die für diesen spezifischen Auslöser relevant sind).
In diesem Fall können Sie einfach so etwas tun wie SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T
um zu sehen, ob der Schwellenwert erreicht ist.
Zusatz
Eine andere Möglichkeit, mit der Sie experimentieren könnten, besteht darin, den Auslöser für diese großen Updates einfach zu umgehen. Sie könnten SET CONTEXT_INFO
verwenden um ein Flag zu setzen und den Wert davon innerhalb des Triggers zu überprüfen. Sie könnten dann OUTPUT inserted.*, deleted.*
verwenden um die „before“- und „after“-Werte für eine Zeile zu erhalten, ohne JOIN
zu müssen überhaupt.
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