我们有一个包含几百个数据库的SQL Server。该服务器上的许多数据库每周只使用几次。我们遇到一个问题,SQL Server有时变得非常慢。当发生这种情况时,内存使用率指示99%并且发生分页。为了解决这个问题,我们计划每晚重新启动SQL服务,以卸载所有这些数据库并释放内存。
在不关闭SQL服务的情况下释放空闲数据库使用的内存的正确方法是什么?我们希望自动卸载过去30分钟内未访问的任何数据库。
注意:我正在寻找适用于SQL 2005的解决方案。但是,如果SQL 2008中有一项功能,我想知道它。
答案 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就是您正在寻找的。 p>
答案 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