Pourquoi la sp_reset_connection
procédure stockée système prendrait-elle plus de quelques millisecondes à s'exécuter, telle que vue via SQL Server Profiler?
J'ai pris une trace simple d'un système de production à l'aide de SQL Server Profiler, puis j'ai utilisé SqlNexus pour l'analyser. SqlNexus indique que sp_reset_connection a la durée cumulée la plus élevée - 33% de la trace globale. La durée observée varie de 0 à 7 secondes (12 à 6 833 270 microsecondes) mais se situe en moyenne à 0,956 s.
Je comprends que sp_reset_connection est appelé lorsqu'une connexion en pool est réutilisée. J'ai vu une suggestion que cela peut se produire en raison de traces étrangères , mais cela ne semble pas être le cas.
J'ai lu ce que fait le serveur lorsque le sproc est appelé mais je ne pense pas que cela serait problématique dans ce cas - le code ne laisse pas de transaction ouverte ou d'énormes tables temporaires qui devraient être nettoyées.
J'ai également consulté /server/199974/sp-reset-connection-taking-a-long-time-to-run mais cela n'a pas été utile.
EDIT (2013-12-23): Dans tous les cas, les lectures et les écritures sont égales à 0 et le CPU est presque toujours égal à 0 (seulement deux instances de CPU non nul, toutes deux à 16 ms).
la source
RPC:Starting
,RPC:Completed
et attendre les types pour une courte période puis regardez à travers les données pour voir ce qui attend les types les SPID rencontrent pendant cette période.Réponses:
J'ai enfin eu le temps d'écrire une réponse plus détaillée.
Il existe généralement trois raisons principales pour lesquelles une procédure simple comme celle-
sp_reset_connection
ci prendra beaucoup de temps.Annonce 1) Si vous attendez des ressources CPU, cela devrait apparaître lorsque le signal attend. S'il vous plaît voir mon commentaire sur votre question sur la façon de diagnostiquer si c'est le problème
Annonce 2) Si vous attendez un verrou, il est préférable de le diagnostiquer en comparant deux instantanés de
sys.dm_os_wait_stats
. Voir cet article sur la façon de procéder:Si vous voyez de longues attentes pour LCK_ [Quelque chose], interrogez pour localiser
sys.dm_tran_locks
les objets qui sont verrouillés. Dans votre cas, je m'attendrais à voir une certaine forme de SCH- [Quelque chose]> verrous vous bloquant.Annonce 3) Le moyen le plus simple de diagnostiquer les problèmes de réseau pour rechercher d'abord OLEDB et ASYNC_NETWORK_IO attend à l'étape 2 (si vous attendez longtemps pour le réseau, l'un d'eux apparaît). Si ces attentes sont élevées, utilisez
xperf -on latency
ou un programme de surveillance de réseau comme netmon ou wirehark pour vérifier vos latences. Si le réseau semble lent, cela peut également être dû au fait que le serveur d'applications appelant ne répond pas assez rapidement à la connexion en cours de recyclage.la source
Je viens de tomber sur un article de la base de connaissances pour un bogue qui pourrait être lié à ce problème. Dans FIX: des problèmes de performances se produisent lorsque l'activité de verrouillage de la base de données augmente dans SQL Server (KB 2926217), l'un des symptômes décrits est que cela
sp_reset_connection
peut prendre du temps. Le correctif est inclus dans les mises à jour suivantes:Le serveur sur lequel j'ai observé ce comportement exécutait SQL Server 2008 SP3 avec la mise à jour cumulative 5, il est donc possible qu'il rencontrait ce bogue. Je n'ai pas encore essayé la mise à jour cumulative (le problème ne se reproduit pas tout le temps), je ne peux donc pas vérifier si cela le corrigerait ou non. Cependant, je voulais fournir des informations au cas où quelqu'un aurait les mêmes symptômes.
la source