2010-11-11 13 views
1

Il y a un déclencheur sur une table pour les mises à jour, insertions et suppressions, mais le T-SQL create-script pour le déclencheur ne contient que la déclaration suivante:Existe-t-il une pénalité de performance pour un déclencheur sans code?

SET NOCOUNT ON 

Y at-il un (significatif) pénalité de performance pour ce déclencheur par rapport à aucun déclencheur? Y aurait-il une pénalité de performance (significative) pour un déclencheur sans instructions (code), encore une fois par rapport à aucun déclencheur?

+0

Pourquoi voudriez-vous garder un déclencheur qui ne fait rien? – HLGEM

+1

@HLGEM - Je ne le ferais pas. J'ai immédiatement supprimé le déclencheur qui a inspiré cette question quand j'ai découvert qu'il "ne fait rien". J'ai posé la question parce que j'étais curieux de connaître l'impact que le déclencheur aurait pu avoir. –

Répondre

3

Sans une connaissance approfondie de ce que fait l'optimiseur, ou une série de tests pour vérifier, c'est difficile à dire. Mais alors, il est difficile de dire à quel point votre idée de significatif est significative. Donc, pour prendre chaque extrême, si vous faites des milliers de mises à jour par seconde, le déclencheur pourrait entraîner une baisse significative des performances ... D'un autre côté, en faisant quelques mises à jour par minute, vous ne le remarquerez probablement pas du tout . Dans les deux cas, le déclencheur sera compilé et éventuellement optimisé.

Moi-même je ne voudrais pas déranger à propos de la performance à moins que la performance ne me dérange pas. Si vous pensez que cela vous cause des problèmes, mesurez-le, supprimez-le et réessayez. Dans la même veine, j'avais un DBA suggérant que je devrais remplacer Coalesce (xyz, 0) par Isnull (xyz, 0). La requête ne me dérangeait pas mais la suggestion l'a fait, j'ai donc fait quelques mesures et j'ai trouvé que c'était en effet 30% plus rapide. Mais à 0.00000031 pour chacun des deux callin coalesce dans ma requête, je n'ai pas modifié ma requête, -

-1

Cette instruction empêche la transmission de messages supplémentaires à l'appelant. Imaginez que vous ayez 5 instructions de mise à jour dans votre déclencheur. Si vous n'aviez pas la ligne NOCOUNT, l'appelant recevrait les messages des 5 instructions. Quelque chose comme ceci: (1 row (s) affected) (1 row (s) affected) (1 row (s) affected) (1 row (s) affected) (1 row (s) affected)

Si vous avez l'ensemble des états NOCOUNT, ils ne recevraient le résultat final message: (1 row (s) affected)

Ce n'est pas nécessairement une mauvaise chose - certains systèmes ne se soucient pas de les messages supplémentaires, et peut-être votre base de données n'est pas si grande que vous vous souciez de toute baisse de performance. Bien que d'autres systèmes s'en soucient - je sais que je dois me rappeler d'utiliser un NOCOUNT dans les procédures stockées qui sont appelées à partir de Reporting Services (SSRS).

+0

Je demandais à propos de la pénalité de performance du code de déclenchement, pas la fonctionnalité de l'instruction 'SET NOCOUNT ON'. –

+0

Je pense que vous êtes également incorrect lorsque vous dites "Si vous avez le jeu d'instructions NOCOUNT, alors ils ne recevraient que le message de résultat final: (1 ligne (s) affectée)" - ils ne recevraient même pas le résultat final message'. –

+0

Je ne pense pas que la réponse mérite un -1, mais c'est votre question. Je pensais que votre question allait dans le sens d'une question plus générale au sujet de la déclaration elle-même. En passant, vous obtiendriez un message "(1 row (s) affected)" avec l'instruction NOCOUNT. Faites un test et voyez par vous-même. –