Vkládání do dočasných tabulek indexovaných na spojovacích sloupcích by mohlo věci vylepšit jako inserted
a deleted
nejsou indexovány.
Můžete zkontrolovat @@ROWCOUNT
uvnitř spouštěče, takže tuto logiku provádíte pouze nad určitým prahovým počtem řádků, i když na serveru SQL Server 2008 to může číslo poněkud nadhodnocovat, pokud byl spouštěč spuštěn v důsledku MERGE
(Vrátí celkový počet řádků ovlivněných všemi MERGE
akce nejen ty, které jsou relevantní pro daný konkrétní spouštěč).
V takovém případě můžete udělat něco jako SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T
abyste zjistili, zda je prahová hodnota splněna.
Přidání
Další možností, se kterou byste mohli experimentovat, je jednoduše obejít spouštěč těchto velkých aktualizací. Můžete použít SET CONTEXT_INFO
nastavit příznak a zkontrolovat jeho hodnotu uvnitř spouštěče. Potom můžete použít OUTPUT inserted.*, deleted.*
pro získání hodnot "před" a "po" pro řádek bez nutnosti JOIN
vůbec.
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