2015-05-28 4 views
5

У меня есть запрос sql, который я пытаюсь запустить на сервере с 8 ГБ ОЗУ. Если я перезапущу сервер, он запустится, а использование памяти составит около 1,2 ГБ.Проблемы с SQL-запросом и оперативной памятью

Если я выполнил запрос, к моменту завершения запроса объем использования ОЗУ составляет около 4 ГБ и, похоже, останется там, даже ночью.

Если я затем выполнил запрос еще раз (на следующий день), объем использования ОЗУ достигнет примерно 7 ГБ и останется там, даже когда запрос завершен.

Если я попытаюсь выполнить запрос снова после ожидания 24 часа, то использование ОЗУ все еще на 7 ГБ, но на этот раз запрос начинает возвращать ошибки из памяти.

Мой вопрос: как очистить использование памяти, когда запрос завершен? В идеале было бы хорошо, если бы сам скрипт sql мог очистить использование ОЗУ, когда он закончил, это основная работа.


Версия сервера:

Это Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64).


Сообщение об ошибке:

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

Можете ли вы добавить подробные сообщения об ошибках? –

+2

В SQL Server Management Studio щелкните правой кнопкой мыши экземпляр сервера, выберите «Свойства», нажмите «Память» и убедитесь, что «Максимальная память сервера» установлена ​​на что-то разумное, в вашем случае - 4096.По умолчанию SQL Server будет использовать всю доступную память и удерживать ее. Это первый шаг. – pmbAustin

+0

Надеюсь, это ваш личный тестовый сервер или что-то в этом роде. В противном случае я определенно рекомендую вам приобрести больше ОЗУ. –

ответ

4

Вы должны установить память сервера макс, чтобы оставить по крайней мере гиг или два доступных для операционной системы и любого другого программного обеспечения на вашем сервере. SQL будет кэшировать данные и освобождать их только при приближении к своим ограничениям.

памяти сервера Используйте макс, чтобы предотвратить пул буферов SQL Server с использованием более, чем указанного объема памяти, в результате чего остальные памяти, доступной для запуска других приложений быстро. SQL Server делает не сразу выделяет память, указанную в максимальной памяти сервера, на запуск. Использование памяти увеличивается по мере необходимости SQL Server до , достигая значения, указанного в максимальной памяти сервера. SQL Server не может превышать это использование памяти, если значение максимальной памяти сервера не равно .

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

Вы можете изменить его с помощью Management Studio, щелкнув правой кнопкой мыши на сервере в окне просмотра объектов и выбора свойств. Затем измените максимальное значение памяти сервера:

enter image description here

0

Чтобы освободить память, вы можете использовать, но это команды, но они только полезно, например, чтобы проверить длительность запроса в постоянном Contex. SQL Server достаточно умен, чтобы пропустить объект из ОЗУ, когда это необходимо.

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

Вы уверены, что вы не используете DBCC PINTABLE, потому что эта команда силы SQL, чтобы сохранить объект в памяти?

+0

Не был удален DBCC PINTABLE уже в 2000 году или что-то в этом роде? Во всяком случае, его нельзя использовать, даже если он все еще существует :) –

Смежные вопросы