2010-07-29 3 views
1

Actuellement, une base de données active continue d'utiliser plus de mémoire jusqu'à environ 5,8 Go, puis commence à générer des erreurs de dépassement de délai de connexion fréquentes. Je comprends que SQL Server est conçu pour utiliser autant de mémoire que possible, mais il ne devrait pas être jeter ces erreurs. En particulier, quelque chose semble fonctionner, ce qui entraîne une croissance de la mémoire d'environ 2 Go très rapidement. La base de données a de nombreux index et procédures stockées, comment puis-je déterminer lequel est responsable?Dépannage des problèmes de mémoire de SQL Server

Répondre

1

Le serveur SQL est conçu pour développer et consommer toute la mémoire du système. Par conséquent, il fera exactement cela, allouer de la mémoire pour le cache de plan de requête et les tables et les index. Il est supposé libérer la mémoire quand le système l'exige mais selon mon expérience, le système commencera à utiliser plus de mémoire en utilisant le système de pagination et les choses ralentiront beaucoup avant que le serveur sql ne libère la mémoire qu'il contient.

Si vos données ne sont pas aussi volumineuses que la mémoire qu'elles semblent manger et que vous n'avez pas trop de connexions, alors elles doivent allouer de la mémoire aux nombreuses caches qu'elles utilisent.

Vous pouvez trouver cela à partir de compteurs de gestionnaire de mémoire perfmon serveur SQL pour déterminer quel composant du serveur sql occupe la majeure partie de la mémoire.

j'ai rencontré juste cela et here are the details of how i solved the issue (link) - une combinaison de limites de mémoire supérieure (sp_configure « max server memory ») + assurant que le cache de plan de requête ne pousse pas trop grand

1

Il ne sera pas la mémoire en tant que tel: SQL Server est conçu pour utiliser

Vous avez probablement une longue opération en cours d'exécution, ou quelque chose d'autre comme le téléchargement, qui bloque d'autres processus.

Exécuter ce pour voir ce qui se passe

SELECT 
    p1.SPID AS blockedSPID, p2.SPID AS blockingSPID, ... 
FROM 
    master..sysprocesses p1 
    JOIN 
    master..sysprocesses p2 ON p1.blocked = p2.spid 

Et quand vous dites « croît de 2 Go ». Avez-vous un fichier MDF ou LDF?

  • LDF = longue transaction course ou ouverte
  • MDF = beaucoup de données générées/téléchargées (j'ai vu un déclencheur d'audit rogue)

L'augmentation de 2 Go de mémoire sera données dans le cache le plus probable

+0

Merci pour la réponse, je vais essayer dès que j'ai une chance. Mais pour répondre rapidement à votre question, je voulais dire que la mémoire augmente de 2 Go (j'ai depuis mis à jour l'OP) – LaserJesus

+0

La DB a juste jeté l'erreur à nouveau: "Timeout a expiré le délai écoulé avant la fin de l'opération ou le serveur ne répond pas". J'ai essayé d'exécuter la requête que vous avez fournie mais elle n'a renvoyé aucune ligne. – LaserJesus