我如何让SQL Server释放内存?

我知道SQL喜欢RAM,但是当Windows询问时会释放它。 我知道这是SQL应该如何工作。 但是我有一个Windowspipe理员谁不相信,SQL实际上会返回内存,并且在这个特定的(虚拟)服务器上,一旦分析服务完成,SQL不需要太多,但是这个服务器上没有任何东西是困扰问SQL很多。

所以我试图向Windowspipe理员保证虚拟环境的问题不是“因为SQL使用了太多的RAM”,但是我似乎无法说服SQL在不重新启动服务的情况下释放它。

在处理多维数据集时,SQL服务高兴地需要8GB的RAM,但是由于没有压力,在正常的日子里它不会释放太多的内存。 Windows的玩家尖叫着,让SQL释放这个会更好。

我不想使用最大内存设置,因为我确实希望SQL在处理时使用那么多的RAM。 我只是想让它再次回落。

它可能是两个SQL Server不释放内存和从SQL Server回收内存的副本,但我想知道是否有不同的答案。 等待Windows收回它不会说服Windows的人在这里。 重新启动服务是一个select,但我真的不是这个想法的粉丝。

我想知道如何让Windows回来…

我相信你唯一的select是重启SQL服务,或者运行一个消耗大量内存的应用程序来强制SQL释放它。

我喜欢@Nick Kavadias的build议:监视Memory:Page Faults / Sec性能计数器,以显示SQL没有将操作系统内存置于压力下。

一种向他们展示这样做的方法是让SQL Server咀嚼所有的内存。 然后通过networking复制一个巨大的文件(大的SQL备份文件很适合这个)。 这将导致系统caching填充,Windows将开始询问SQL的内存。 SQL将开始将内存返回到操作系统,直到达到最小内存设置。

(对不起没有通过Twitter得到整个问题,显然需要超过140个字符。)

你提到“立方体”,所以不清楚你是在谈论AS引擎还是关系引擎。 关系引擎可以根据需要释放内存:

 DBCC FREESYSTEMCACHE('<cache name>'); 

从sys.dm_os_memory_clerks获取“caching名称”。 DBCC FREESYSTEMCACHE的规格只提到了调节池,但实际上可以驱逐更多的caching。

但是,如果所有的内存都被缓冲池使用,那么驱逐整个缓冲池将会导致巨大的性能下降和巨大的IO负载。 最好让SQL自己处理。

使用AS和DS引擎,您可以在内存上设置一个上限,使其保持在安全阈值以下。 build议在具有大量RAM和/或多个SQL实例的64位机器上使用。 至less对于数据库引擎来说,如果将内存上限更改为当前使用量以下,那么将不必重新启动服务即可减less内存使用量,但对SSAS不太确定。

我发现的最简单的方法是转到服务器内存属性,input一个较小的值,应用,等待几分钟,然后调整configuration备份。

我们也发现节streamSQL服务器的内存使用率实际上可以提高服务器的性能,因为它为Windows提供了更多的内存caching等等。