每日加载后SQL Server不释放内存

时间:2018-04-27 20:43:24

标签: sql-server database sql-server-2012

我们有一个SQL Server 2012企业版,128GB内存,Windows 2008R2。 SQL Server作业每天凌晨3点运行,需要5小时才能将数据加载到数据库中。在此过程中,SQL Server使用123GB(分配的最大内存)。

作业完成后,SQL Server不会释放RAM。

查询缓冲池显示97GB的内存利用率。用户在此期间不访问数据库。我重新启动SQL Server服务以降低RAM。我没有找到与此问题相关的正确答案。为什么不释放内存?我们如何降低RAM利用率?

SQL Server作业 - > SSIS包 - >将数据从Mysql导入SQL Server数据库

由于

3 个答案:

答案 0 :(得分:1)

这是设计一旦SQL Server使用内存,它会保留它并且不会将其释放回操作系统。

您的任务管理器可能会显示SQL Server使用的所有/几乎所有内存,但如果您想查看SQL Server实际使用的内存量,可以使用以下查询。

SELECT    (physical_memory_in_use_kb/1024) AS Memory_usedby_Sqlserver_MB
FROM sys.dm_os_process_memory;  

答案 1 :(得分:1)

按照设计,SQL Server保留已分配的RAM。大部分RAM用于缓冲池。缓冲池是一个缓存,它将数据库页面保存在内存中以便快速检索。

如果SQL Server要释放一些内存,并且有人要运行一个后来请求它的查询,那么查询将不得不等待昂贵的物理I / O来生成数据。因此,SQL Server会尽可能长时间地保留尽可能多的内存(以及配置)。

RAM settings here指定最小服务器内存最大服务器内存。仔细设置最大内存设置可以为其他进程提供运行空间。文章引用了一个复杂的公式来确定离开的空间:

  
      
  • 从整个操作系统内存中,保留1GB-4GB到操作系统本身。
  •   
  • 然后减去潜在SQL Server内存分配的等效项   在最大服务器内存控制之外,它由堆栈组成   大小1 *计算最大工作线程2 + -g启动参数3(或   默认情况下为256MB,如果未设置-g)。剩下的应该是什么   单个实例设置的max_server_memory设置。
  •   

在我们的服务器中,我们通常只需将其设置为最大内存选项,使其低于总物理内存的几GB。这为操作系统和其他应用程序留下了足够的空间。

如果SQL Server内存位于 min服务器内存上,并且操作系统处于内存压力下,SQL Server可以释放内存,直到它处于 min server memory 设置

参考:Memory Management Architecture Guide

  

所有数据库软件的主要设计目标之一是   最小化磁盘I / O,因为磁盘读写是最多的   资源密集型业务。 SQL Server在中构建缓冲池   用于保存从数据库读取的页面的内存。 SQL中的大部分代码   服务器致力于最大限度地减少物理读取和数量   在磁盘和缓冲池之间写入。 SQL Server试图达到   两个目标之间的平衡:

     
      
  • 保持缓冲池不会变得太大,以致整个系统内存不足。
  •   
  • 通过最大化缓冲池的大小,最大限度地减少数据库文件的物理I / O.
  •   
     

当SQL Server动态使用内存时,它会查询系统   定期确定可用内存量。保持这一点   空闲内存可防止操作系统(OS)进行分页。如果少   内存是免费的,SQL Server向操作系统释放内存。如果更多的记忆   是免费的,SQL Server可能会分配更多的内存。 SQL Server添加内存   只有当工作量需要更多内存时;休息的服务器没有   增加其虚拟地址空间的大小。

     

...

     

随着越来越多的用户连接并运行查询,SQL Server获取了   按需增加物理内存。 SQL Server实例继续   获取物理内存,直到它到达其最大服务器   内存分配目标或Windows表示不再有   过剩的自由记忆;当它超过最小值时,它会释放内存   服务器内存设置,Windows表示存在短缺   自由记忆。

     

在运行实例的计算机上启动其他应用程序   SQL Server,它们消耗内存和可用物理内存量   低于SQL Server目标。 SQL Server实例调整   它的内存消耗。如果另一个应用程序停止等等   内存变得可用,SQL Server的实例增加了   内存分配的大小。 SQL Server可以免费获取几个   每秒兆字节的内存,允许它快速调整到   内存分配变化。

如果出于某种原因:

  1. 你绝对必须拥有那段记忆
  2. 你知道你暂时不需要它
  3. 您愿意支付虚拟内存分配和物理I / O的罚款,以便在您下次需要该内存时从磁盘检索数据
  4. 然后,您可以暂时将数据库 max server memory 设置重新配置为较低的值。这可以通过SSMS用户界面完成,也可以使用sp_configure 'max server memory'后跟reconfigure以编程方式进行更改。

答案 2 :(得分:0)

完全披露:我自己没有尝试过。 在对其他地方进行测试之前,不应该在生产环境中尝试它。

这来自DBA answer

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

4096应替换为您认为可接受的最小值。

应该跟一个类似的命令,将内存增加到原来的最大值。