osh*_*nen 5 sql t-sql sql-server ram sql-server-2008
我有一个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.
Run Code Online (Sandbox Code Playgroud)
您应该设置最大服务器内存,以便为操作系统和服务器上的任何其他软件留出至少一到两个可用内存。SQL 将缓存数据并仅在接近其限制时释放它。
使用最大服务器内存可防止 SQL Server 缓冲池使用超过指定数量的内存,从而使剩余内存可用于快速启动其他应用程序。SQL Server 在启动时不会立即分配最大服务器内存中指定的内存。SQL Server 会根据需要增加内存使用量,直到达到最大服务器内存中指定的值。SQL Server 不能超过此内存使用量,除非提高最大服务器内存的值。
https://msdn.microsoft.com/en-us/library/ms178067%28v=sql.105%29.aspx
您可以使用 Management Studio 更改它,方法是右键单击对象查看器中的服务器并选择属性。然后更改最大服务器内存值:

| 归档时间: |
|
| 查看次数: |
4318 次 |
| 最近记录: |