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.
Czy możesz dodać szczegółowe komunikaty o błędach? –
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
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. –