我们有一个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数据库
由于
答案 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可以免费获取几个 每秒兆字节的内存,允许它快速调整到 内存分配变化。
如果出于某种原因:
然后,您可以暂时将数据库 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
应替换为您认为可接受的最小值。
应该跟一个类似的命令,将内存增加到原来的最大值。