Management Studio System.OutOfMemoryException


38

Ich verwende Microsoft SQL Server 2012 und versuche, eine einfache Abfrage in Management Studio auszuführen. Ich erhalte die folgende Fehlermeldung (in SSMS auf dem Server ausgeführt):

Beim Ausführen des Stapels ist ein Fehler aufgetreten. Fehlermeldung: Ausnahme vom Typ "System.OutOfMemoryException" wurde ausgelöst.

Auf dem System sind 24 GB RAM installiert, aber im Task-Manager verwendet der Prozess sqlservr.exe nur 2,9 GB.

Gibt es irgendwo eine Einstellung, die die RAM-Nutzung einschränkt?

Antworten:


39

Dieser Fehler weist darauf hin, dass Management Studio nicht über genügend Arbeitsspeicher verfügt, sondern über den SQL Server-Dienst. Selbst wenn Sie 64-Bit-SQL Server installiert haben, handelt es sich bei der ausführbaren SQL Server Management Studio-Datei um eine 32-Bit-Anwendung.

Dies liegt wahrscheinlich an der Größe der Ergebnismenge, die Sie an Management Studio zurückgeben. Führen Sie so etwas wie SELECT * FROM really_big_table aus? Weitere Informationen finden Sie unter http://support.microsoft.com/kb/2874903 .


19

Mike hat Recht, dass die Fehlermeldung, die Sie erhalten, von der Management Studio-Anwendung selbst und nicht von SQL Server stammt. Es ist der Speicher auf Ihrer lokalen Workstation, der erschöpft ist, wahrscheinlich weil versucht wurde, 16 Milliarden Zeilen in die Clientanwendung zu ziehen (das Rendern dieser Daten in einem Grid ist in Bezug auf den Speicher ziemlich teuer, also versuchen Sie, Ihre Abfragen mit TOPetc. Zu begrenzen Ich weiß nicht, welche praktischen Dinge Sie möglicherweise mit genügend Daten tun könnten, um ohnehin den gesamten lokalen Speicher zu belegen.

Ich möchte jedoch ein anderes Problem ansprechen: Verwenden des Task-Managers zum Ermitteln der von SQL Server verwendeten Speicherkapazität. Mach das nicht; Es ist ein mutiger Lügner. Kopieren von dieser Antwort (Ihre Frage ist zweifach, daher kann ich sie nicht wirklich als Duplikat schließen):


Sie können sich NIEMALS darauf verlassen, dass der Task-Manager Ihnen mitteilt, wie viel Speicher SQL Server verwendet. Verwenden Sie den Task-Manager in diesem Zeitraum nicht mehr. Leistungsindikator verwenden - Sie können den Leistungsindikator auch mit DMVs abfragen:

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

Sie können dies als Abfrageverknüpfung in Extras> Optionen> Umgebung> Tastatur> Abfrageverknüpfungen speichern und in einem Abfragefenster genaue Ergebnisse erhalten, viel schneller als ungenaue Ergebnisse vom Task-Manager.

Sie können auch anhand der folgenden Abfragen überprüfen, ob der Arbeitsspeicher belastet ist (und ob Sie etwas dagegen tun können):

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';

Die obigen Befehle gelten für neue Versionen von SQL. Bei SQL 2008 R2-Servern unterscheiden sich die dortigen Befehle geringfügig. Ich füge diesem unteren Bereich einen weiteren Beitrag für diese Server hinzu, da nachfolgende Kommentare nicht gut genug formatiert sind, um sie hier
David Bridge,

15

Bei mir war es genauso. Mein SQL Server Management Studio war einige Tage geöffnet. Ich habe es neu gestartet und es wurde gelöst.


9

Ich fand es hilfreich, IntelliSense auszuschalten. Ich empfehle außerdem, alle von Ihnen verwendeten Add-Ins zu überprüfen (Dinge wie RedGate-Tools und ApexSQL haben das Problem für mich ebenfalls verschlimmert).

Dieses Problem plagte mich schon seit Tagen und ehrlich gesagt ist es ziemlich schwach von Microsoft. Sie sollten wirklich 64-Bit-Tool-Sets haben, da wir es heutzutage mit Big Data, 64-Bit-Servern und Desktop-Umgebungen zu tun haben.


1
In meinem Fall kämpfte RedGate SQL Prompt mit dem in Intellisense integrierten SSMS. Durch das Deaktivieren von SSMS Intellisense funktionierte SQL Prompt auch viel besser.
TTT

1

Für SQL 2008 R2 lauten die Speicherabfragebefehle (von Aaron Bertrands Beitrag) wie folgt

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;

Beachten Sie auch, dass der Befehl

EXEC sp_configure 'max server memory';

funktioniert möglicherweise nicht, es sei denn, Sie haben erweiterte Optionen aktiviert. zB mach das zuerst

EXEC sp_configure 'show advanced options',1
RECONFIGURE

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.