SQL 查询和 RAM 问题
SQL Query and RAM issues
我有一个 sql 查询,我正尝试在具有 8GB RAM 的服务器上 运行。如果我重新启动服务器,它会启动并且内存使用量约为 1.2GB。
如果我随后执行查询,到查询完成时,RAM 使用量将达到大约 4GB,并且似乎一直保持在那里,甚至过夜。
如果我再次执行查询(第二天),RAM 使用量会上升到大约 7GB 并且即使在查询完成后也会保持在那里。
如果我在等待 24 小时后再次尝试执行查询,RAM 使用率仍为 7GB,但这次,查询开始返回内存不足错误。
我的问题是,如何在查询完成后清除内存使用量 运行ning?理想情况下,如果 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.
您应该设置您的最大服务器内存,以便至少为 OS 和您服务器上的任何其他软件留出一两个可用空间。 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 更改它,方法是在对象查看器中右键单击服务器并选择属性。然后更改最大服务器内存值:
要释放内存,您可以使用此命令,但它们仅适用于例如在常量上下文中测试查询持续时间。 SQL 服务器足够聪明,可以在需要时从 RAM 中取出对象。
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
您确定不使用 DBCC PINTABLE
因为此命令强制 SQL 将对象保存在 RAM 中吗?
我有一个 sql 查询,我正尝试在具有 8GB RAM 的服务器上 运行。如果我重新启动服务器,它会启动并且内存使用量约为 1.2GB。
如果我随后执行查询,到查询完成时,RAM 使用量将达到大约 4GB,并且似乎一直保持在那里,甚至过夜。
如果我再次执行查询(第二天),RAM 使用量会上升到大约 7GB 并且即使在查询完成后也会保持在那里。
如果我在等待 24 小时后再次尝试执行查询,RAM 使用率仍为 7GB,但这次,查询开始返回内存不足错误。
我的问题是,如何在查询完成后清除内存使用量 运行ning?理想情况下,如果 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.
您应该设置您的最大服务器内存,以便至少为 OS 和您服务器上的任何其他软件留出一两个可用空间。 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 更改它,方法是在对象查看器中右键单击服务器并选择属性。然后更改最大服务器内存值:
要释放内存,您可以使用此命令,但它们仅适用于例如在常量上下文中测试查询持续时间。 SQL 服务器足够聪明,可以在需要时从 RAM 中取出对象。
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
您确定不使用 DBCC PINTABLE
因为此命令强制 SQL 将对象保存在 RAM 中吗?