Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Jointure lente sur les tables de déclenchement insérées/supprimées

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