Puis-je arrêter sp_reset_connection d'être appelé pour améliorer les performances?
Ma trace du générateur de profils montre que exec sp_reset_connection
est appelé entre toutes les commandes sql ou une procédure d'appel. Il y a pour des raisonsmais puis-je l'empêcher d'être appelé, si je suis convaincu qu'il est inutile, pour améliorer les performances?
Mise à JOUR:
La raison j'imagine que cela pourrait améliorer les performances est double:
- SQL Server n'a pas besoin de réinitialiser l'état de la connexion. Je pense que ce serait relativement négligeable d'amélioration.
- Réduit la latence du réseau, car le client n'a pas besoin d'envoyer un
exec sp_reset_connection
attendre la réponse, puis envoyer ce que sql il veut vraiment exécuter.
Le second avantage est la seule qui m'intéresse, parce que dans mon architecture, les clients sont parfois à une certaine distance de la base de données. Si toutes les commandes sql ou rpc exige un double aller-retour, cela double l'impact de la latence du réseau. L'élimination de cette double appels pourraient potentiellement améliorer les performances.
Oui, il ya beaucoup d'autres choses que je pourrais faire pour améliorer les performances comme le re-architecte de l'application, et je suis un grand fan de la résolution de la cause des problèmes, mais dans ce cas, je veux juste savoir si c'est possible pour éviter sp_reset_connection à être appelé. Ensuite, je peux tester si il n'y a aucune amélioration de la performance et évaluer correctement les risques de ne pas l'appel de cette.
Cela nous amène à une autre question: est ce que le réseau de communication avec sp_reset_connection vraiment se produire, comme je l'ai indiqué ci-dessus? c'est à dire le client Ne peut envoyer exec sp_reset_connection
attendre une réponse, puis envoyer le real sql? Ou faut-il aller tous en un seul morceau?
source d'informationauteur Rory | 2010-10-23
Vous devez vous connecter pour publier un commentaire.
Si vous êtes en utilisant .NET pour se connecter à SQL Server, la désactivation de l'extra reset a été désactivé .NET 3.5 -- voir ici. (Le reste des biens, mais il ne fait rien.)
Je suppose que Microsoft a réalisé (comme quelqu'un l'a fait expérimentalement ici) que l'ouverture de la porte pour éviter la réinitialisation a été beaucoup plus dangereux qu'il était d'obtenir une (probable) d'un petit gain de performance. Ne peux pas dire que je le leur reprocher.
EDIT: j'ai eu tort -- voir icila réponse est non.
Résumé: il existe un ensemble de bits dans un TDS message qui indique que la connexion doit être remis à zéro, et SQL Server exécute
sp_reset_connection
automatiquement. Il apparaît comme un lot distinct dans le Profiler et pourrait toujours être exécuté avant que le réel de la requête que vous vouliez exécuter, de sorte que mon test n'était pas valide.Oui, il est envoyé dans un lot séparé.
J'ai mis en place un peu de C# programme de test pour le démontrer, parce que j'étais curieux:
Démarrer le générateur de profils et de le joindre à votre instance de choix, de filtrage sur le mannequin nom de l'application que j'ai fournis. Ensuite, placez un point d'arrêt sur la
cmd.ExecuteNonQuery();
ligne et exécuter le programme.De la première étape au-dessus, juste à l'exécution de la requête, et tout ce que vous obtenez est le SQL:BatchCompleted événement après 5 secondes d'attente. Lorsque le point d'arrêt est atteint la deuxième fois, tout ce que vous voyez dans le profiler est toujours juste l'un des événements. Lorsque vous franchissez à nouveau, vous immédiatement voir le
exec sp_reset_connection
événement, puis le SQL:BatchCompleted événement s'affiche après le retard.Le seul moyen de se débarrasser de la
exec sp_reset_connection
l'appel (qui peut ou peut ne pas être légitime problème de performance pour vous) serait pour l'éteindre .NET est le regroupement de connexion. Et si vous avez l'intention de le faire, vous seriez probablement voulez construire votre propre connexion mécanisme de mise en commun, car il suffit de l'éteindre et de ne rien faire d'autre le fera sans doute fait plus de mal que de prendre le coup de l'aller-retour supplémentaire, et vous aurez à traiter avec la justesse des questions manuellement.Personnellement, je l'avais quitter.
Compte tenu de ce qu'il fait, je veux m'assurer que je n'ai pas de temp tables dans la portée ou les opérations d'ouverture à gauche.
Pour être juste, vous gagnerez un gros boost de performance en n'exécutant pas profiler à l'encontre de votre base de données de production. Et avez-vous des chiffres ou des articles ou des recommandations sur ce que vous pouvez gagner de cette s'il vous plaît?
Ce Q/r pourrait être utile:
Ce n' "exec sp_reset_connection" dans Sql Server Profiler?
Cependant, j'ai fait un test rapide à l'aide de Entity Framework et MS-SQL 2008 R2. Il montre que "exec sp_reset_connection" n'est pas beaucoup de temps après le premier appel:
Et de sortie:
Donc, la conclusion finale est: Ne vous inquiétez pas "exec sp_reset_connection"! Il gaspille rien.
Il suffit de garder la connexion ouverte, au lieu de retourner à la piscine, et d'exécuter toutes les commandes sur une seule connexion.