SQL Server 内存占用高分析及解决办法(超详细)

SQL Server 内存占用高分析及解决办法(超详细)

一、问题

1.1、SQL Server内存占用高 ,内存不释放

1.2、SQL Server 内存使用策略

SQL Server对服务器内存的使用策略是有多少占多少(大约到剩余内存为4M左右)只用在服务器内存不足时,

才会释放一点占用的内存,所以很多时候,我们会发现运行SQL Server的系统内存往往居高不下这些内存一般都

是SQL Server运行时候用作缓存的。

数据缓存:

例如:你运行一个select语句,那么SQL Server会将相关的数据页(SQL Server操作的数据都是以页为单位的

SQL Server中页的大小始终是8kb的大小,页有不同的类型:数据页,索引页,系统页等等)加载到内存中进行

缓存,以便于再次请求此页的数据的时候,直接从内存返回,就无需读取磁盘了,大大提高了速度。

执行命令缓存:

如执行存储过程,自定函数时,SQL Server 需要先二进制编译再运行,编译后的结果也会缓存起来,再次调用时就无需再次编译。

二、解决办法

当我们知道SQL Server 内存占用方式,就有以下两种解决办法

清除缓存

sql 复制代码
-- 查看内存使用情况,这个会返回多个结果集数据,可以有助于我们排查内存问题
DBCC MemoryStatus

结果集部分重要指标解释(请注意,DBCC MEMORYSTATUS的输出格式和内容可能会随着SQL Server版本的不同而有所变化):对指标不感兴趣,一股脑解决问题可跳过 如下指标查看,直接到下面 缓存清除命令

1、Total Server Memory (KB)

  • 含义:SQL Server实际使用的内存量(以千字节为单位)。
  • 重要性:这是SQL Server当前占用的实际物理内存大小,直接反映了SQL Server对系统资源的影响。如果这个值接近或超过了配置的最大服务器内存限制,可能表明存在内存压力。

2、Target Server Memory (KB)

  • 含义:SQL Server理想情况下想要保留的内存量(以千字节为单位),基于当前负载和配置参数计算得出的目标值。
  • 重要性 :与Total Server Memory对比,可以帮助识别是否存在内存不足的情况。如果Total Server Memory远低于Target Server Memory,则可能是由于其他进程占用了过多的内存。

3、Memory Grants Outstanding

  • 含义:等待分配给查询的内存请求数量。
  • 重要性:此数字较大时,意味着有大量并发查询正在争夺有限的内存资源,可能导致查询延迟增加。长期保持高位可能需要调整最大内存设置或者优化查询。

4、Page Life Expectancy (PLE)

  • 含义 :一个页面在缓冲池中停留而不被移出的平均时间(以秒为单位)。虽然PLE不是DBCC MEMORYSTATUS直接输出的字段,但可以通过sys.dm_os_performance_counters视图获取。
  • 重要性:PLE是一个重要的内存健康指标。较高的PLE值通常表示内存充足,而较低的PLE值(例如小于300秒)可能指示内存压力,因为页面被频繁地从缓存中移除。

5、Available Physical Memory (KB)

  • 含义:当前可用的物理内存量(以千字节为单位),即未被占用或预留的内存。
  • 重要性:了解系统的整体内存情况,帮助判断是否有足够的空闲内存供SQL Server和其他应用程序使用。低可用内存可能导致操作系统开始交换内存到磁盘,从而降低性能。

6、Available Paging File (KB)

  • 含义:当前可用的页面文件空间量(以千字节为单位)。
  • 重要性:尽管SQL Server尽量避免使用页面文件,但如果物理内存不足,它仍会依赖页面文件。因此,确保有足够的页面文件空间也很重要,但应尽量减少对它的依赖。

7、Percent of Committed Memory in WS

  • 含义:已提交的内存中位于工作集内的百分比。
  • 重要性:这个比率有助于理解有多少已分配给SQL Server的内存正被积极使用。高比例表明大部分内存都在活跃使用中,而低比例可能暗示有未充分利用的内存或存在过多的内存分配。

8、System Physical Memory Low

  • 含义:一个状态标志,表示系统物理内存处于"低"水平。
  • 重要性:当此标志为真时,意味着系统物理内存接近耗尽,可能需要采取行动来缓解内存压力,比如增加物理内存、优化查询或调整SQL Server的最大内存设置。

9、Page Faults

  • 含义:页面错误的数量,指的是尝试访问不在物理内存中的页面而触发的操作系统加载页面的行为次数。
  • 重要性:频繁的页面错误(特别是硬页面错误)可能指示内存不足,因为每次页面错误都会导致磁盘I/O操作,这将显著影响性能。

10、Memory Grants Pending

  • 含义:已提交但尚未完成处理的内存请求队列长度。
  • 重要性:如果这个值非零,意味着有内存请求在等待处理,这可能会延迟查询执行。长期存在的非零值可能指向内存争用问题。

11、Lock Pages in Memory Usage (KB)

  • 含义:如果启用了"锁页"选项,则该值表示用于锁定到物理内存中的页数量(以千字节为单位)。
  • 重要性:启用"锁页"可以防止SQL Server的工作集被换出到磁盘,提高性能。但是,这也减少了操作系统可用于其他进程的物理内存。

12、Large Pages Allocated (KB)

  • 含义:如果启用了大页支持,则显示已分配的大页内存量(以千字节为单位)。
  • 重要性:大页可以减少TLB(Translation Lookaside Buffer)丢失并提升性能。对于大型数据仓库或OLAP环境,启用大页支持可能会带来性能改进。

这些关键指标提供了关于SQL Server内存使用情况的全面视图,并且对于诊断性能问题非常有价值。通过定期监控这些指标,可以及时发现潜在的问题,并采取适当的措施来优化SQL Server的性能。此外,结合动态管理视图(DMVs),如sys.dm_os_memory_clerkssys.dm_exec_query_memory_grants等,以及性能计数器,可以获得更加详细的洞察力,从而更好地管理和调优SQL Server实例。

缓存清除命令

sql 复制代码
-- 临时清除缓存命令
DBCC FREEPROCCACHE --清除存储过程相关的缓存
DBCC REESESSIONCACHE --清除会话缓存
DBCC FREESYSTEMCACHE('All') --清除系统缓存
DBCC DROPCLEANBUFFERS --清除所有缓存

以上命令虽然会清除掉现有缓存,为新的缓存腾出空间,但是Sql server并不会因此释放掉已经占用的内存。Sql

Server并没有提供任何命令允许我们释放不用到的内存。因此我们只能通过动态调整Sql Server可用的物理内存设

置来强迫它释放内存。

如果想让 Sql Server 主动释放 占用并空闲的内存空间,可以设置Sql Server占用内存的上限,就会让Sql server在

内存上限范围内,主动清除脏数据替换成热数据。因此还得如下操作

三、设置内存最大占用值

设置方式:

从自带的studio 连接,,在数据库服务器名称上点击【右键】,选择【属性】,然后,找到【内存】选项,在右边的【使用AWE分配内存】(sqlServer64的应该不用勾)左边把对勾打上。在最大服务器内存(MB)上填入适当的大小(具体填多大,肯定不能超过计算机的物理内存,建议控制在60%-75%),设置成功后重启

四、 其他

结果集图片:执行 DBCC MemoryStatus

最后文章有啥不对,欢迎大佬在评论区指点!!!

如果感觉对你有帮助就点赞推荐 或者关注 一下吧!!!

相关推荐
程序员不想YY啊6 分钟前
MySQL元数据库完全指南:探秘数据背后的数据
数据库·mysql·oracle
数据最前线10 分钟前
Doris表设计与分区策略:让海量数据管理更高效
数据库
时光追逐者19 分钟前
MongoDB从入门到实战之MongoDB快速入门(附带学习路线图)
数据库·学习·mongodb
头顶秃成一缕光42 分钟前
Redis的主从模式和哨兵模式
数据库·redis·缓存
AIGC大时代44 分钟前
高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!
数据库·人工智能·算法·aigc·智能写作·deepseek
博睿谷IT99_1 小时前
数据库证书可以选OCP认证吗?
数据库·oracle·开闭原则·ocp认证
乐维_lwops1 小时前
数据库监控 | MongoDB监控全解析
数据库·mongodb·数据库监控
观无1 小时前
Redis安装及入门应用
数据库·redis·缓存
柏油2 小时前
MySql InnoDB 事务实现之 undo log 日志
数据库·后端·mysql
DolphinScheduler社区3 小时前
白鲸开源WhaleStudio与崖山数据库管理系统YashanDB完成产品兼容互认证
数据库·开源·认证·崖山数据库·白鲸开源