SQL 查询和 RAM 问题

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

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

如果我随后执行查询,则当查询完成时,RAM 使用量将达到约 4GB,并且似乎会保持在该水平,甚至整夜也不异常(exception)。

如果我再次执行查询(第二天),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.

最佳答案

您应该设置最大服务器内存,以便为操作系统和服务器上的任何其他软件留出至少一到两个可用内存。 SQL 会缓存数据,只有在接近其限制时才释放它。

Use max server memory to prevent the SQL Server buffer pool from using more than the specified amount of memory, thus leaving remaining memory available to start other applications quickly. SQL Server does not immediately allocate the memory specified in max server memory on startup. Memory usage is increased as needed by SQL Server until reaching the value specified in max server memory. SQL Server cannot exceed this memory usage unless the value of max server memory is raised.

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

您可以使用 Management Studio 更改它,方法是右键单击对象查看器中的服务器并选择属性。然后更改最大服务器内存值:

enter image description here

关于SQL 查询和 RAM 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30510099/

相关文章:

sql - 在 XML 数据类型中存储特殊字符(例如 &)

mysql - 我怎样才能以逗号分隔列表的形式获得子值?

sql-server - 为什么 JTDS 比 Microsoft JDBC 驱动程序更快?

sql - 用户定义的函数 - 它们是糟糕的编码实践吗?

java - 无法执行查询

SQL 服务器 : How to seperate XML nodes in different rows

php - 错误消息 : Premature end of script headers

sql - 检查字符串以特定字母开头

sql - 向表中添加数字 id

performance - 优化查询以减少 i/o 压力是否有意义?