如何释放空闲SQL Server数据库使用的内存?

时间:2011-04-26 18:50:42

标签: sql-server

我们有一个包含几百个数据库的SQL Server。该服务器上的许多数据库每周只使用几次。我们遇到一个问题,SQL Server有时变得非常慢。当发生这种情况时,内存使用率指示99%并且发生分页。为了解决这个问题,我们计划每晚重新启动SQL服务,以卸载所有这些数据库并释放内存。

在不关闭SQL服务的情况下释放空闲数据库使用的内存的正确方法是什么?我们希望自动卸载过去30分钟内未访问的任何数据库。

注意:我正在寻找适用于SQL 2005的解决方案。但是,如果SQL 2008中有一项功能,我想知道它。

5 个答案:

答案 0 :(得分:10)

SQL Server将自动释放所有可以释放的内存并避免分页。如果遇到分页,则99%的内存正在使用中,无法释放。您需要调查内存是如何使用的,它可能是外部组件,如sp_oa_xxx创建的对象或分布式查询。首先调查内存消费者,查看sys.dm_os_memory_clerks并阅读How to use the DBCC MEMORYSTATUS command to monitor memory usage on SQL Server 2005

作为旁注,您已经可以自动关闭不可用的数据库:alter database <dbname> set auto_close on

  

AUTO_CLOSE:设置为ON时,   数据库干净利落地关闭   资源在最后一次之后被释放   用户退出。数据库自动生成   当用户尝试使用时重新打开   数据库再次。

如果您托管了数百个很少使用的数据库,那么AUTO_CLOSE就是您正在寻找的。

答案 1 :(得分:4)

首先,我建议调查一下:

DBCC FREEPROCCACHE

DBCC DROPCLEANBUFFERS

它们不是特定于数据库的,但它们可以取代您每晚的重启。

对于特定于数据库的命令,您可以发出一个CHECKPOINT,它会强制任何脏页到磁盘,但它只适用于写入。

在SQL Server 2008(和R2) Enterprise Edition 中,您可以利用资源调控器将内存分割为池,并将更多部分专用于关键数据库,从而可以更精细地控制CPU和记忆。要做到这一点,需要进行彻底的规划和测试。

答案 2 :(得分:2)

试试这个:

ALTER DATABASE blah SET AUTO_CLOSE ON;

此设置(通常不建议用于生产)可能适合您的情况。此设置适用于SQL Server 2005和2008。

有关详细信息:http://msdn.microsoft.com/en-us/library/bb522682.aspx

答案 3 :(得分:1)

对于MSSQL 2012;

首先运行
EXEC sys.sp_configure N'max server memory (MB)', N'256'
GO
RECONFIGURE WITH OVERRIDE
GO

然后检查任务管理器,看内存是否低至256 MB(或上面设置的更高)

然后运行此操作( 将2048替换为您要定期分配的MB ):

EXEC sys.sp_configure N'max server memory (MB)', N'2048'
GO
RECONFIGURE WITH OVERRIDE
GO

答案 4 :(得分:0)

之前我遇到过这样的问题,我找到了解决此问题的方法,您可以创建一个存储过程,如下所述:在启动应用程序之前,您应该在模式1中调用此存储过程,因为您需要足够的内存

对于SQL操作,在关闭应用程序之前,必须再次在模式0

中调用此存储过程
Create Proc [dbo].[MP_Rpt_ConfigureMemory]
    (@Mode bit)
as
    declare @RAM as integer
    declare @MAX as integer
    declare @MIN as integer

    set @RAM = (SELECT
                   [physical_memory_in_bytes]/1048576 AS [RAM (MB)]
                FROM [sys].[dm_os_sys_info])

    Set @MAX = ((@RAM / 4) * 3) 
    Set @MIN = ((@RAM / 4) * 1) 

    if @Mode = 0
    begin
         exec SP_Configure 'min server memory', 1
         RECONFIGURE

         exec SP_Configure 'max server memory', 100
         RECONFIGURE
    end
    else
       if @Mode = 1
       begin
           exec SP_Configure 'max server memory', @MAX
           RECONFIGURE
           exec SP_Configure 'min server memory', @MIN
           RECONFIGURE
       end