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

时间:2016-08-17 14:03:28

标签: sql-server windows memory

  

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

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

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;

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

7 个答案:

答案 0 :(得分:3)

SQL Server始终假定它是运行的主应用程序。它不是为了共享资源而设计的。它将始终占用所有可用内存,并且只会为操作系统释放它,除非您使用“最大服务器内存”进行限制。

按照设计,Sql Server无法与其他人一起使用。

此sqlskills文章建议使用限制基准,然后根据需要监控和提高限制:

https://www.sqlskills.com/blogs/jonathan/how-much-memory-does-my-sql-server-actually-need/

答案 1 :(得分:1)

以下修改后的脚本对我有用。我需要临时释放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  

答案 2 :(得分:0)

我没有解决方法如何释放分配的内存。但是,出于我们的目的,我们能够弄清楚如何允许主动 - 主动群集安全地运行。我们决定将最小服务器内存设置为~2GB。这很有用,因为无论实例决定使用多少内存,它都不会在内存中运行其他实例。所以再一次,这解决了我们的目的,但它仍然没有回答实际使用了多少内存,我们可以降低最大服务器内存等等的问题......

答案 3 :(得分:0)

以防万一,在紧急情况下,如果停机时间很短,只需重新启动SQL服务即可。只需几秒钟即可重新启动并很好地完成工作。右键单击您的服务器名称,然后单击重新启动。

答案 4 :(得分:-1)

您必须设置“最大服务器内存”。到1-2 GB之间的某个值。在大多数情况下,此范围是安全的。执行以下操作后可能需要一段时间才能释放内存:

sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
sp_configure 'max server memory', 1024;  
GO  
RECONFIGURE;  
GO  

该设置允许清除池,编译内存,所有缓存,clr内存等

最大服务器内存的最小值'是128 MB,但不建议这样做,因为SQL Server可能无法在某些配置中启动。如果发生这种情况,请使用" -f"切换到以最小配置强制SQL启动,然后将值更改为原始值。

答案 5 :(得分:-1)

此帖子通过以下链接解决,请查看格式:

SQL Server not releasing memory after query executes

答案 6 :(得分:-1)

我不认为SQL Server会释放内存,除非操作系统主动请求它。如果存在其他进程请求更多内存的情况,并且根本没有内存,则SQL Server将自行释放未使用的内存。我可能会限制SQL的最大允许内存,而不是尝试刷新不可用的内存。

sp_configure 'show advanced options', 1
GO  

RECONFIGURE
GO  

sp_configure 'max server memory', 512; --or some other value
GO  

RECONFIGURE
GO

有关详细信息,您可以查看此MSDN文章:https://msdn.microsoft.com/en-us/library/ms178067.aspx