Il y a beaucoup de questions ici sur l'échange de DBA. Mais aucun d'entre eux ne peut m'aider.
J'ai 2 problèmes:
1) en utilisant sp_whoisactive
, J'ai trouvé beaucoup de sys.sp_reset_connection;1
(Je sais qu'ils sont sp_reset_connections
parce que j'ai utilisé dbcc inputbuffer
(SPID):
Il s'agit du "serveur principal", de sorte que les autres serveurs (3,4,7) demandent en permanence des informations sur certaines bases de données ici (et ce que je vois, chaque demande est destinée à la base de données principale).
2) Pourquoi ils prennent autant de temps?
En regardant quelques réponses ici, j'ai constaté que le système attend la CPU. Mais tout CPU est null. Comment cela peut-il être le problème?
Sous le serveur SQL Covers utilise la logique SP_RESET_Connection pour "Réinitialiser" l'état de connexion pour le serveur SQL, ce qui est plus rapide que l'établissement d'une nouvelle connexion complètement nouvelle. Les conducteurs plus âgés envoient l'appel à la procédure comme une sortie ronde distincte, TDS sur le serveur SQL.
Les nouveaux pilotes clients ajoutent un bit de drapeau avec la commande suivante, en évitant le trajet aller-retour du réseau supplémentaire.
Bon ... mais je ne sais toujours pas quoi faire.
Cela ne me donne pas de problèmes. Je veux juste savoir comment résoudre ce problème.
S'il n'y a pas de problèmes de performance, vous pouvez probablement ignorer ce que vous voyez. Voir SP_RESET_Connection - Utilisation des tarifs (ne vous battez pas sur les raisins Par Bob Dorr - Ingénieur d'escalade SQL Server principale, Points forts ci-dessous:
Sous le serveur SQL Covers utilise la logique SP_RESET_Connection pour "Réinitialiser" l'état de connexion pour le serveur SQL, ce qui est plus rapide que l'établissement d'une nouvelle connexion complètement nouvelle. Les conducteurs plus âgés envoient l'appel à la procédure comme une sortie ronde distincte, TDS sur le serveur SQL. Les plus récents pilotes clients ajoutent un bit de drapeau avec la commande suivante, en évitant le trajet aller-retour du réseau supplémentaire.
Les discussions se tournent rapidement vers: "Qu'est-ce qu'un taux raisonnable de SP_RESET_Connections sur mon serveur?" Comme d'habitude, la réponse dépend toujours.
Il n'y a pas une règle dure et rapide, mais utilise le moniteur de performances, vous pouvez comparer rapidement le taux de lot global aux taux de connexion de réinitialisation. Lorsque je vois que le taux commence à grimper au-dessus de 15%, c'est une assez bonne indication que l'application peut avoir besoin d'être revisitée et ajustée un peu.
Avec tout cela, vous devez faire attention à ne pas étendre le ratio trop loin. Garder la connexion lorsqu'il n'est pas nécessaire augmentera le nombre total de connexions en utilisant davantage de fraises de client et SQL Server. Vous devez trouver la tache sucrée qui optimise les ressources du client et SQL Server et optimise les capacités de performance des applications.
Vous pouvez également envisager des modifications récentes qui réduisent la surcharge de SP_RESET_Connection sur le serveur SQL
Dan Guzman a également commenté:
sp_reset_connection
ne prend généralement pas plus que quelques millisecondes (généralement des microsecondes). L'exception est quand une restauration est nécessaire car la connexion a été renvoyée à la piscine avec une transaction ouverte. Je soupçonne quand tu courasDBCC INPUTBUFFER
, alors c'est la dernière commande qui a été courue, pas celle qui prenait beaucoup de temps.
sp_reset_connection
est un artefact d'utiliser la mise en commun de la connexion. Et ce que vous pensez que vous voyez n'est pas ce qui se passe réellement.
La mise en commun de la connexion est une caractéristique de la bibliothèque cliente supérieure à SQL Server. Le client fournit la plupart des fonctionnalités, tandis que SQL Server lui-même fournit principalement sp_reset_connection
. Lorsque vous utilisez la mise en commun de la connexion, le pilote client ne ferme pas réellement la connexion physique au serveur SQL lorsque le code d'application appelle la méthode "fermeture ferme". Au lieu de cela, le pilote conserve la connexion ouverte et le liera à la requête suivante "Open Connection" qui utilise exactement la même chaîne de connexion (et à partir du même compte Windows, si vous utilisez une connexion fiduciée/sécurité intégrée). Maintenant, comme la connexion n'a jamais été fermée, SQL Server sait uniquement que le client garde la connexion ouverte, mais pas pourquoi. Et comme la connexion est ouverte, la session existe toujours avec toutes les ressources et les paramètres en place à partir de la dernière commande/lot exécuté. C'est pourquoi les tableaux temporaires créés dans la portée principale (c'est-à-dire non dans une procédure stockée) continueront d'exister (pour plus de détails, veuillez consulter: sessions, objets temporaires et après-vie ) et une transaction ouverte reste ouvert.
SQL Server ne sait pas que la mise en commun de la connexion est utilisée jusqu'à ce que la prochaine commande/lot soit soumise, à quel point il exécute sp_reset_connection
. Il est sp_reset_connection
Cela nettoie l'état préalable de la session afin que ce soit comme une toute nouvelle session, ce que le code client s'attend à (avec quelques éléments mineurs qui ne sont pas nettoyés/réinitialisés).
Bien sûr, cette description est basée sur les nouveaux pilotes. En tant que citation de la question, les conducteurs âgés ont envoyé une demande distincte de sp_reset_connection
. Le fait que vous voyiez des sessions qui n'ont aucune demande d'exécution actuellement (c'est-à-dire la CPU est NULL
) est attendue lors de l'utilisation de la mise en commun de la connexion. Ce qui n'est pas typique consiste à voir sp_reset_connection
passant par DBCC INPUTBUFFER
. Ce n'est pas typique depuis que les nouveaux pilotes demandent sp_reset_connection
Lors de la présentation du premier lot/commande lors de la reconnexion, vous ne verriez jamais sp_reset_connection
Comme il ne sera jamais la dernière chose à exécuter (bien que vous puissiez le voir à l'aide du profileur SQL Server ou des événements étendus). Mais si vous le voyez en utilisant DBCC INPUTBUFFER
(qui continuera à afficher la dernière commande/lot exécuté, même après la fin du lot), cela semblerait correspondre au comportement des conducteurs âgés (en supposant que les anciens entraîneurs, car ils n'envoient pas de drapeau avec La commande suivante/lot, demande sp_reset_connection
Sur "Connexion rapprochée").
Dans les deux cas, sp_reset_connection
ne fonctionne pas actuellement. Et la raison pour laquelle les demandes sont toutes pour le master
dB est très probablement à faire pour master
étant la base de données par défaut pour le (s) identifiant (s) utilisé (s).