2010-11-12 22 views
0

J'ai eu des problèmes de performance avec un déclencheur SQL. Le problème concerne l'exécution d'une requête SQL lors de l'utilisation d'une instruction select avec la table de déclencheur INSERTED.Problème: déclenchement Copie de lignes SUPPRIME dans INSERTION ou table des variables

SELECT x FROM y WHERE x IN (SELECT x FROM INSERTED) 

Le plan d'exécution de la requête des points à l'(SELECT x FROM INSERTED) beaucoup plus long que prévu. Nous parlons x1000s de lignes ici.

Si je crée une variable de table, et je sélectionne les lignes de Inséré dans la variable de table, puis utilisez la variable de table de la clause « IN », il est beaucoup plus rapide.

Ma question est pourquoi est-ce plus rapide? J'ai déjà une idée de ce que ça pourrait être. J'ai lu que la table INSERTED est une table virtuelle et cela provient des journaux de transactions et prend donc beaucoup plus de temps à lire que l'utilisation de la variable de table. Cependant, j'aurais pensé que sélectionner les lignes de la table INSERTED dans la variable table annulerait les effets positifs de l'utilisation de la variable table dans la clause 'IN'.

Toutes les idées pour lesquelles cela est beaucoup plus rapide?

+0

Désolé pour ça, je m'en souviendrai pour la prochaine fois! – jaffa

Répondre

0

ne pouvait pas vous essayer juste un JOIN régulier avec la table INSERTED? Ceux qui sont souvent bien meilleurs que les sous-requêtes:

SELECT x 
FROM y 
INNER JOIN INSERTED i ON y.x = i.x 

Ne connaissant pas tous les détails, il est impossible de savoir avec certitude si cela vous aidera à tous - mais il est defintely la peine d'essayer!

+0

J'utilise en fait une instruction UPDATE sur une seule ligne qui est mise à jour avec un horodatage lorsque l'une de ses tables enfant est mise à jour (qui a 1000s de lignes). Y a-t-il une raison pour laquelle sélectionner les lignes insérées dans une table temporaire est plus rapide que de l'utiliser directement dans une déclaration? – jaffa