web-dev-qa-db-fra.com

Management Studio System.OutOfMemoryException

J'utilise Microsoft SQL Server 2012 et j'essaie d'exécuter une requête simple contre lui dans Management Studio. J'obtiens l'erreur suivante (dans SSMS, en cours d'exécution sur le serveur):

Une erreur s'est produite lors de l'exécution du lot. Le message d'erreur est: Une exception de type "System.OutOfMemoryException" a été levée.

Le système a 24 Go de RAM installé mais en regardant dans le gestionnaire de tâches le processus sqlservr.exe utilise seulement 2,9 Go.

Y a-t-il un paramètre quelque part qui restreint son utilisation RAM?

38
Ben Durkin

Cette erreur indique que Management Studio manque de mémoire, pas le service SQL Server. Même si vous avez installé SQL Server 64 bits, l'exécutable SQL Server Management Studio est une application 32 bits.

Cela est probablement dû à la taille de l'ensemble de résultats que vous retournez à Management Studio. Exécutez-vous quelque chose comme SELECT * FROM really_big_table? Voir http://support.Microsoft.com/kb/28749 pour en savoir plus.

39
Mike Stankavich

Mike a raison de dire que le message d'erreur que vous recevez provient de l'application Management Studio elle-même et non de SQL Server. C'est la mémoire de votre poste de travail local qui a été épuisée, probablement en raison de la tentative de tirer 16 milliards de lignes dans l'application client (le rendu d'autant de données dans une grille est assez cher en termes de mémoire, alors essayez de limiter vos requêtes en utilisant TOP etc. - Je ne sais pas ce que vous pourriez faire avec assez de données pour utiliser toute votre mémoire locale de toute façon).

Mais je veux résoudre un autre problème: utiliser le Gestionnaire des tâches pour évaluer la quantité de mémoire que SQL Server utilise. Ne fais pas ça; c'est un menteur audacieux. Copie de cette réponse (votre question est double, donc je ne peux pas vraiment la fermer en double):


Vous ne pouvez JAMAIS, JAMAIS faire confiance au Gestionnaire des tâches pour vous indiquer la quantité de mémoire utilisée par SQL Server. Arrêtez d'utiliser le Gestionnaire des tâches pour cela, point. Utilisez le compteur de performances - vous pouvez également interroger le compteur de performances à l'aide de DMV:

SELECT object_name, cntr_value 
  FROM sys.dm_os_performance_counters
  WHERE counter_name = 'Total Server Memory (KB)';

Vous pouvez l'enregistrer en tant que raccourci de requête dans Outils> Options> Environnement> Clavier> Raccourcis de requête et obtenir des résultats précis dans une fenêtre de requête beaucoup plus rapidement que d'obtenir des résultats inexacts du Gestionnaire des tâches.

Vous pouvez également vérifier la pression de la mémoire (et si vous pouvez y remédier) en utilisant ces requêtes:

SELECT object_name, cntr_value
  FROM sys.dm_os_performance_counters
  WHERE counter_name IN ('Total Server Memory (KB)', 'Target Server Memory (KB)');

-- SQL Server 2012:
SELECT physical_memory_kb FROM sys.dm_os_sys_info;

-- Prior versions:
SELECT physical_memory_in_bytes FROM sys.dm_os_sys_info;

EXEC sp_configure 'max server memory';
19
Aaron Bertrand

C'était le même cas avec moi. Mon SQL Server Management Studio a été ouvert pendant quelques jours. Je l'ai redémarré et il a été résolu.

15
Barry Guvenkaya

J'ai trouvé que la désactivation d'IntelliSense avait aidé. Je recommande également de vérifier tous les compléments que vous avez (des outils comme RedGate et ApexSQL ont également exacerbé le problème pour moi).

Ce problème me tourmente depuis des jours maintenant et pour être honnête, il est assez faible de Microsoft. Ils devraient vraiment avoir des ensembles d'outils 64 bits, car nous traitons de nos jours les mégadonnées, les serveurs 64 bits et les environnements de bureau.

9
Tahir Khalid

Pour SQL 2008 R2, les commandes de requête de mémoire (du post d'Aaron Bertrand) sont les suivantes

SELECT object_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name = 'Total Server Memory (KB)';

SELECT object_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name IN ('Total Server Memory (KB)', 'Target Server Memory (KB)');

-- SQL Server 2012:
SELECT physical_memory_in_bytes FROM sys.dm_os_sys_info;

-- Prior versions:
SELECT physical_memory_in_bytes FROM sys.dm_os_sys_info;

Notez également que la commande

EXEC sp_configure 'max server memory';

peut ne pas fonctionner sauf si vous avez activé les options avancées. par exemple. fais ceci en premier

EXEC sp_configure 'show advanced options',1
RECONFIGURE
1
David Bridge

Veuillez noter qu'il y a un problème de connexion Microsoft pour cela comme étant une fuite de mémoire SSMS. Ils pensent l'avoir résolu en v16.5

Voir le problème sur Connect.Microsoft.com en cliquant ici

Si vous installez la dernière version et que vous rencontrez toujours le problème, veuillez voter pour la réouverture.

SSMS v16.5 ici

Problème de connexion indiquant une fuite de mémoire corrigé dans 16.5 ici

1
David Bridge