Wstawianie do tymczasowych tabel zindeksowanych na łączących się kolumnach może dobrze poprawić sytuację, ponieważ inserted
i deleted
nie są indeksowane.
Możesz sprawdzić @@ROWCOUNT
wewnątrz wyzwalacza, aby wykonać tę logikę tylko powyżej pewnej progowej liczby wierszy, chociaż w SQL Server 2008 może to nieco zawyżać liczbę, jeśli wyzwalacz został uruchomiony w wyniku MERGE
oświadczenie (Zwróci całkowitą liczbę wierszy, na które ma wpływ wszystkie MERGE
działania, a nie tylko te związane z konkretnym wyzwalaczem).
W takim przypadku możesz po prostu zrobić coś takiego jak SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T
aby sprawdzić, czy próg został osiągnięty.
Dodanie
Inną możliwością, z którą możesz poeksperymentować, jest po prostu ominięcie wyzwalacza dla tych dużych aktualizacji. Możesz użyć SET CONTEXT_INFO
ustawić flagę i sprawdzić wartość tego wewnątrz wyzwalacza. Następnie możesz użyć OUTPUT inserted.*, deleted.*
aby uzyskać wartości "przed" i "po" dla wiersza bez konieczności JOIN
w ogóle.
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