L'insertion dans des tables temporaires indexées sur les colonnes de jointure pourrait bien améliorer les choses car inserted
et deleted
ne sont pas indexés.
Vous pouvez vérifier @@ROWCOUNT
à l'intérieur du déclencheur, vous n'exécutez donc cette logique qu'au-dessus d'un certain nombre de lignes seuil, bien que sur SQL Server 2008, cela puisse surestimer quelque peu le nombre si le déclencheur a été déclenché à la suite d'un MERGE
déclaration (elle renverra le nombre total de lignes affectées par tous les MERGE
actions et pas seulement celle pertinente pour ce déclencheur spécifique).
Dans ce cas, vous pouvez simplement faire quelque chose comme SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T
pour voir si le seuil est atteint.
Ajout
Une autre possibilité que vous pourriez expérimenter consiste simplement à contourner le déclencheur de ces mises à jour volumineuses. Vous pouvez utiliser SET CONTEXT_INFO
pour définir un indicateur et vérifier la valeur de celui-ci à l'intérieur du déclencheur. Vous pouvez alors utiliser OUTPUT inserted.*, deleted.*
pour obtenir les valeurs "avant" et "après" pour une ligne sans avoir besoin de JOIN
du tout.
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