从SQL Server中回收内存

我有一个SQL Server实例的内存使用逐渐增长,直到Windows将不再。 偶然的大查询结果会导致实例增长似乎是合乎逻辑的。

有没有一种方法可以说服SQL Server释放它不再需要的内存(除了重新启动服务)呢?

编辑:
我正在使用SQL Server 2000 SQL Server 8.00.2039 – SP4(标准版)

我能够使用以下查询find:

SELECT 'SQL Server ' + CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - ' + CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' (' + CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')' 

这正是SQL Server 应该如何工作的。

如果在该机器上有其他服务,并且不希望SQL消耗所有可用的内存,则需要设置最大的服务器内存。 请参阅MSDN上的SQL Server内存选项 。

其他海报是正确的,这是devise,但你绝对要限制最大的内存less于你的服务器的RAM。 想想这一系列事件:

  • SQL 2000运行愉快,消耗所有的服务器的RAM
  • 有人RDP,或者你必须拉起IE下载补丁,或者你的备份开始,不pipe
  • SQL必须释放并释放足够的内存才能使操作系统正常工作
  • 在释放内存和分页到磁盘时,性能很糟糕
  • 一旦稳定,事情就会好起来
  • 另一个操作完成,SQL逐渐回收释放的RAM
  • 重复

为了避免这种情况,请将最大服务器内存限制configuration为实际物理内存的80-90%左右。 SQL 2000的说明: http : //msdn.microsoft.com/en-us/library/ms178067.aspx

它只会在操作系统发出内存不足的情况下释放,或者停止并重新启动服务; 要做的事情是通过configuration“最大服务器内存”值限制SQL将使用的最大量。 如果服务器上没有其他东西需要内存(希望没有),我不会担心。

所以,总结一下答案:

没有办法提示MS SQL Server释放它不会立即需要的内存。 SQL Server应该在需要时自动释放内存,但不是在那之前。 如果你的内存有问题,你应该降低“最大服务器内存”内存的价值。

SQL Server将消耗内存,除非操作系统告知存在内存压力,否则不会返回内存。 正如波特曼所指出的,这是devise的,如果你想限制内存消耗,你需要设置SQL Server将使用的最大服务器内存。

请记住,您所描述的行为是从SQL Server 2005开始的,当内存pipe理器被重写为(除其他之外)响应来自操作系统的内存压力请求。

对于SQL Server 2000和之前的版本,一旦抓取内存,它不会放弃,无论操作系统对此有多大喊叫。

CodeSlave – 你在2000年,2005年还是2008年运行?

旧的问题,我知道,但强制(更新,至less)SQL释放内存的方式是写一个应用程序分配尽可能多的内存,因为它可以在块,等待(比如说)15秒(如睡眠(15000))并释放分配的内存并退出; 我试过这个,SQL确实释放了内存,所以系统恢复了内存; 使用C / C ++编写像上面这样的代码几乎是微不足道的,只需要build立一个链表来保存内存块链(指针和大小),在“malloc()”失败之前逐渐减小大小,直到达到最小值(小于1024),然后遍历链表来释放分配的块