2015-05-28 24 views
5

Mam kwerendę sql, które próbuję uruchomić na serwerze, który ma 8 GB pamięci RAM. Jeśli zrestartuję serwer, uruchomi się i zużycie pamięci wynosi około 1,2 GB.Problemy z zapytaniami SQL i pamięcią RAM

Po wykonaniu kwerendy, do czasu zakończenia kwerendy, użycie pamięci RAM wynosi około 4 GB i wydaje się, że pozostaje tam nawet przez noc.

Jeśli ponownie wykonam zapytanie (następnego dnia), użycie pamięci RAM wzrasta do około 7 GB i pozostaje tam nawet po zakończeniu zapytania.

Jeśli spróbuję ponownie wykonać zapytanie po odczekaniu 24 godzin, użycie pamięci RAM nadal wynosi 7 GB, ale tym razem zapytanie rozpocznie się z błędami pamięci.

Moje pytanie brzmi: jak wyczyścić użycie pamięci po zakończeniu kwerendy? Idealnie byłoby, gdyby skrypt SQL sam mógł wyczyścić pamięć RAM po zakończeniu głównego zadania.


Wersja serwera:

Jest to Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64).


Komunikat o błędzie jest:

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

Czy możesz dodać szczegółowe komunikaty o błędach? –

+2

W SQL Server Management Studio kliknij prawym przyciskiem myszy instancję serwera, wybierz Właściwości, kliknij stronę "Pamięć" i upewnij się, że "Maksymalna pamięć serwera" jest ustawiona na coś rozsądnego, w twoim przypadku 4096.Domyślnie SQL Server wykorzysta całą dostępną pamięć i przytrzyma ją. To pierwszy krok. – pmbAustin

+0

Mam nadzieję, że to tylko twój osobisty serwer testowy lub coś w tym stylu. W przeciwnym razie zdecydowanie zaleciłbym zakup większej ilości pamięci RAM. –

Odpowiedz

4

Należy ustawić max server memory zostawić przynajmniej koncert lub dwa dostępne dla systemu operacyjnego i innego oprogramowania na serwerze. SQL będzie cache danych i tylko zwolnij go, gdy zbliża się do jego limitów.

Wykorzystanie pamięci serwera max zapobiec basen bufora SQL Server z użyciem więcej niż określonej ilości pamięci, pozostawiając pozostałe pamięci dostępnej do szybkiego uruchamiania innych aplikacji. SQL Server nie robi natychmiastowej alokacji pamięci określonej w pamięci max serwera przy uruchamianiu . Wykorzystanie pamięci zwiększa się w miarę potrzeby przez program SQL Server do momentu osiągnięcia wartości określonej w maksymalnej pamięci serwera. SQL Server nie może przekroczyć tego wykorzystania pamięci, chyba że podniesiona zostanie wartość maksymalnej pamięci serwera: .

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

Można go zmienić z Management Studio klikając prawym przyciskiem myszy na serwerze w przeglądarce obiektów i właściwości wybierania. Następnie zmienić maksymalną wartość pamięci serwera:

enter image description here

0

Aby zwolnić pamięć, można użyć polecenia, ale to jednak są one jedynie przydatne na przykład w celu sprawdzenia czasu trwania kwerendy w stałym Contex. SQL Server jest na tyle sprytny, aby móc oddzielić obiekt od pamięci RAM, kiedy jest potrzebny.

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

Czy jesteś pewien, że nie należy używać DBCC PINTABLE ponieważ siła tego polecenia SQL do utrzymania obiektu w pamięci RAM?

+0

Czy DBCC PINTABLE nie został usunięty już w 2000 roku lub coś w tym stylu? W każdym razie nie powinno się go używać, nawet jeśli nadal istnieje :) –

Powiązane problemy