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

Syl*_*ain 15 sql-server

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

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

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

Rem*_*anu 10

SQL Server将自动释放所有可以释放的内存,并避免分页.如果遇到分页,则99%的内存正在使用中,无法释放.您需要调查内存是如何使用的,它可能是外部组件,如sp_oa_xxx创建的对象或分布式查询.首先调查内存使用者,查看sys.dm_os_memory_clerks并阅读如何使用DBCC MEMORYSTATUS命令监视SQL Server 2005上的内存使用情况.

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

AUTO_CLOSE:设置为ON时,数据库将完全关闭,并在最后一个用户退出后释放其资源.当用户再次尝试使用数据库时,数据库会自动重新打开.

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


art*_*sql 4

首先,我建议研究一下:

DBCC FREEPROCCACHE
Run Code Online (Sandbox Code Playgroud)

DBCC DROPCLEANBUFFERS
Run Code Online (Sandbox Code Playgroud)

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

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

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