SQL查询和RAM问题

时间:2015-05-28 14:55:57

标签: sql sql-server sql-server-2008 tsql ram

我有一个sql查询,我试图在具有8GB RAM的服务器上运行。如果我重新启动服务器,它将启动,内存使用量约为1.2GB。

如果我然后执行查询,那么在查询完成之前,RAM使用率大约为4GB,并且似乎保持在那里,即使是过夜。

如果我再次执行查询(第二天),RAM使用量将增加到大约7GB,即使查询完成也会保持不变。

如果我在等待24小时后尝试再次执行查询,则RAM使用率仍为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.

2 个答案:

答案 0 :(得分:4)

您应该将最大服务器内存设置为至少为操作系统和服务器上的任何其他软件提供一两个可用的内存。 SQL将缓存数据,并仅在接近它的限制时释放它。

  

使用max server memory阻止SQL Server缓冲池的使用   超过指定的内存量,从而留下余下的   内存可用于快速启动其他应用程序。 SQL Server有   不能立即分配max server memory中指定的内存   启动。 SQL Server需要增加内存使用量,直到   达到max server memory中指定的值。 SQL Server不能   超出此内存使用量,除非max server memory的值为   提高。

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

您可以通过在对象查看器中右键单击服务器并选择属性来使用Management Studio进行更改。然后更改最大服务器内存值:

enter image description here

答案 1 :(得分:0)

要释放内存,您可以使用但是这些命令,但它们仅用于测试常量上下文中的查询持续时间。 SQL Server非常聪明,可以在需要时从RAM中删除对象。

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

您确定不使用DBCC PINTABLE,因为此命令强制SQL将对象保留在RAM中吗?