Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Langsamer Join für eingefügte/gelöschte Triggertabellen

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