你如何强制SQL Server释放内存?

Tig*_*z32 16 memory windows sql-server

检查当前正在使用多少(实际)内存与SQL Server分配给自身的数量的好方法是什么?

我一直在使用memory_utilization_百分比,但在运行以下内容后释放内存似乎没有改变.

SELECT  [Memory_usedby_Sqlserver_MB] = ( physical_memory_in_use_kb / 1024 ) ,
        [Memory_utilization_percentage] = memory_utilization_percentage 
FROM    sys.dm_os_process_memory;

DBCC FREESYSTEMCACHE ('ALL')
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE

SELECT  [Memory_usedby_Sqlserver_MB] = ( physical_memory_in_use_kb / 1024 ) ,
        [Memory_utilization_percentage] = memory_utilization_percentage 
FROM    sys.dm_os_process_memory;
Run Code Online (Sandbox Code Playgroud)

解决方案是删除SQL Server的最大服务器内存并再次增加它以强制SQL Server释放未使用但已分配的内存.但是,这种方法的一个问题是我们无法确定减少最大服务器内存的距离,因此存在查杀SQL Server的风险.这就是为什么在减少max server memory的值之前了解SQL Server"实际"使用了多少很重要的原因.

Num*_*low 11

下面修改后的脚本对我有用。我需要暂时释放 SQLServer 持有的一堆 RAM,以便我们可以在同一台服务器上运行其他一些一次性进程。它暂时释放 SQL 的保留内存空间,同时仍允许它根据需要吞噬内存。

我添加了一个内置等待,让 SQLServer 在将内存恢复到原始级别之前实际释放内存。显然,根据需要调整值以满足您的需要。

sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
/*** Drop the max down to 64GB temporarily ***/
sp_configure 'max server memory', 65536;  --64GB
GO  
RECONFIGURE;  
GO  
/**** Wait a couple minutes to let SQLServer to naturally release the RAM..... ****/
WAITFOR DELAY '00:02:00'; 
GO
/** now bump it back up to "lots of RAM"! ****/
sp_configure 'max server memory', 215040;    --210 GB
GO  
RECONFIGURE;    
GO  
Run Code Online (Sandbox Code Playgroud)