2015-05-28 13 views
5

Ho una query sql che sto tentando di eseguire su un server con 8 GB di RAM. Se riavvio il server, si avvia e l'utilizzo della memoria è di circa 1,2 GB.Problemi di query SQL e RAM

Se si esegue la query, al termine della query, l'utilizzo della RAM passa a circa 4 GB e sembra rimanere lì, anche durante la notte.

Se si esegue nuovamente la query (il giorno successivo), l'utilizzo della RAM sale a circa 7 GB e rimane lì anche quando la query è terminata.

Se si tenta di eseguire nuovamente la query dopo aver atteso 24 ore, l'utilizzo della RAM è ancora a 7 GB, ma questa volta la query inizia a restituire gli errori di memoria esauriti.

La mia domanda è, come si cancella l'utilizzo della memoria al termine dell'esecuzione della query? Idealmente, sarebbe bene se lo script sql stesso potesse cancellare l'utilizzo della RAM al termine del suo lavoro principale.


La versione del server è:

E 'Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64).


Il messaggio di errore è:

System.Data.SqlClient.SqlException (0x80131904): There is insufficient memory available in the buffer pool. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
    at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 
    at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() 
    at System.Data.SqlClient.SqlDataReader.get_MetaData() 
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader() 
    at Project1.Form1.intenseProcess3() in c:\Users\oshirowanen\Documents\Visual Studio 2013\Projects\Project1\Form1.cs:line 117 
ClientConnectionId:33f515db-0086-4f88-a8fd-e7779d92d030 
Error Number:802,State:20,Class:17 SqlException caught. 
+0

È possibile aggiungere messaggi di errore dettagliati? –

+2

In SQL Server Management Studio, fare clic con il pulsante destro del mouse sull'istanza del server, selezionare Proprietà, fare clic sulla pagina "Memoria" e assicurarsi che "Memoria del server massima" sia impostata su qualcosa di ragionevole, nel proprio caso, 4096.Per impostazione predefinita, SQL Server utilizzerà tutta la memoria disponibile e la manterrà. questo è il primo passo. – pmbAustin

+0

Spero che questo sia solo il tuo server di test personale o qualcosa del genere. Altrimenti ti consiglierei di acquistare più RAM. –

risposta

4

È necessario impostare la memoria massima del server di lasciare almeno un concerto o due disponibili per il sistema operativo e qualsiasi altro software sul server. SQL memorizzerà i dati nella cache e li rilascia solo quando si avvicinano ai limiti.

memoria Usa server max per evitare che il pool di buffer di SQL Server di utilizzare più che la quantità di memoria specificata, lasciando così rimanendo memoria disponibile per avviare altre applicazioni in modo rapido. SQL Server fa non allocare immediatamente la memoria specificata nella memoria massima del server sull'avvio . L'utilizzo della memoria è aumentato, se necessario, da SQL Server fino al raggiungendo il valore specificato nella memoria massima del server. SQL Server non può superare questo utilizzo della memoria a meno che il valore della memoria massima del server sia aumentato di .

https://msdn.microsoft.com/en-us/library/ms178067%28v=sql.105%29.aspx

che è possibile sostituire con Management Studio facendo clic destro sul server nel visualizzatore oggetto e selezionando Proprietà. Quindi modificare il valore massimo di memoria del server:

enter image description here

0

Per liberare memoria, è possibile utilizzare i comandi ma questo ma sono solo utile ad esempio per testare la durata query in un Contex costante. SQL Server è abbastanza intelligente da rimuovere oggetti dalla RAM quando è necessario.

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

Sei sicuro di non utilizzare DBCC PINTABLE perché questo comando forza SQL per mantenere oggetto in RAM?

+0

DBCC PINTABLE non è stato rimosso già nel 2000 o qualcosa di simile? Comunque, non dovrebbe essere usato anche se esiste ancora :) –