Management Studio System.OutOfMemoryException


38

Sto utilizzando Microsoft SQL Server 2012 e sto provando a eseguire una semplice query su di esso all'interno di Management Studio. Ricevo il seguente errore (in SSMS, in esecuzione sul server):

Si è verificato un errore durante l'esecuzione del batch. Il messaggio di errore è: è stata generata un'eccezione di tipo "System.OutOfMemoryException".

Nel sistema sono installati 24 GB di RAM, ma guardando nel task manager il processo sqlservr.exe utilizza solo 2,9 GB.

C'è un'impostazione da qualche parte che ne limita l'utilizzo della RAM?

Risposte:


39

Questo errore indica che Management Studio sta esaurendo la memoria, non il servizio SQL Server. Anche se hai installato SQL Server a 64 bit, l'eseguibile di SQL Server Management Studio è un'applicazione a 32 bit.

Ciò è probabilmente causato dalle dimensioni del set di risultati che si sta restituendo a Management Studio. Stai eseguendo qualcosa come SELECT * FROM really_big_table? Vedere http://support.microsoft.com/kb/2874903 per ulteriori informazioni.


19

Mike ha ragione sul fatto che il messaggio di errore che stai ricevendo proviene dall'applicazione Management Studio stessa e non da SQL Server. È la memoria della workstation locale che è stata esaurita, probabilmente a causa del tentativo di inserire 16 miliardi di righe nell'applicazione client (il rendering di molti dati in una griglia è piuttosto costoso in termini di memoria, quindi cerca di limitare le tue query utilizzando TOPecc. - Non so quali cose pratiche potresti eventualmente fare con dati sufficienti per utilizzare comunque tutta la tua memoria locale).

Ma voglio affrontare un altro problema: usare Task Manager per valutare la quantità di memoria che SQL Server sta usando. Non farlo; è un bugiardo dal viso audace. Copia da questa risposta (la tua domanda è duplice, quindi non posso davvero chiuderla come duplicato):


Non puoi MAI, MAI fidarti di Task Manager per dirti quanta memoria utilizza SQL Server. Smetti di usare Task Manager per questo, punto. Utilizza il contatore delle prestazioni: puoi anche eseguire una query sul contatore delle prestazioni utilizzando i DMV:

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

Puoi salvarlo come scorciatoia di query in Strumenti> Opzioni> Ambiente> Tastiera> Scorciatoie di query e ottenere risultati accurati in una finestra di query molto più velocemente rispetto a ottenere risultati imprecisi da Task Manager.

Puoi anche controllare la pressione della memoria (e se puoi fare qualcosa al riguardo) usando queste query:

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

I comandi precedenti sono per le nuove versioni di SQL. Per i server SQL 2008 R2, i comandi sono leggermente diversi. Aggiungerò un altro post a questo in basso per quei server poiché i commenti di follow-up non si formattano abbastanza bene da mettere qui
David Bridge

15

È stato lo stesso caso con me. Il mio SQL Server Management Studio è stato aperto per un paio di giorni. L'ho riavviato e si è risolto.


9

Ho scoperto che disattivare IntelliSense mi ha aiutato. Consiglio anche di controllare tutti i componenti aggiuntivi che hai (cose come gli strumenti RedGate e ApexSQL hanno anche aggravato il problema per me).

Questo problema mi ha afflitto per giorni e, ad essere sincero, è piuttosto debole di Microsoft. Dovrebbero davvero avere set di strumenti a 64 bit, poiché al giorno d'oggi abbiamo a che fare con big data, server a 64 bit e ambienti desktop.


1
Nel mio caso RedGate SQL Prompt stava combattendo con SSMS integrato in intellisense. La disattivazione di SSMS intellisense ha consentito al SQL Prompt di funzionare molto meglio.
TTT,

1

Per SQL 2008 R2 i comandi di query di memoria (dal post di Aaron Bertrand) sono i seguenti

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;

Si noti inoltre che il comando

EXEC sp_configure 'max server memory';

potrebbe non funzionare a meno che tu non abbia abilitato le opzioni avanzate. ad esempio farlo prima

EXEC sp_configure 'show advanced options',1
RECONFIGURE

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.