2015-05-28 51 views
5

我有我想其中有8GB內存的服務器上運行的SQL查詢。如果我重新啓動服務器,它將啓動並且內存使用量約爲1.2GB。SQL查詢和RAM問題

如果我再執行查詢,查詢結束的時候,RAM使用去約4GB,似乎呆在那裏,甚至過夜。

如果我再次執行查詢(第二天),該內存的使用上升到約7GB並在那裏停留,即使查詢已完成。

如果我再嘗試等待24小時後再次執行查詢時,內存使用仍然處於7GB,但是這一次,查詢開始返回內存不足的錯誤。

我的問題是,如何我清除,當查詢已完成運行內存使用情況?理想情況下,如果SQL腳本完成主要工作時可以清除RAM使用情況,那將會很好。


服務器版本是:

它的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

我希望這只是你的個人測試服務器或類似的東西。否則,我肯定會推薦你購買更多的RAM。 –

回答

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足夠聰明,可以在需要時從RAM移走對象。

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

你確定你不使用DBCC PINTABLE因爲這個命令部隊SQL保持對象RAM?

+0

是不是已經在2000年刪除了DBCC PINTABLE或類似的東西?總之,它不應該被使用,即使它仍然存在:) –