首页 > 数据库 >SQL Server 内存占用高分析及解决办法(超详细)

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

时间:2025-01-17 11:48:32浏览次数:1  
标签:缓存 Memory Server 内存 SQL 页面

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 内存占用方式,就有以下两种解决办法

  • 清除缓存

-- 查看内存使用情况,这个会返回多个结果集数据,可以有助于我们排查内存问题
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实例。

缓存清除命令

-- 临时清除缓存命令
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%),设置成功后重启

image

四、 其他

结果集图片:执行 DBCC MemoryStatus

最后文章有啥不对,欢迎大佬在评论区指点!!!
如果感觉对你有帮助就点赞推荐或者关注一下吧!!!
img

标签:缓存,Memory,Server,内存,SQL,页面
From: https://www.cnblogs.com/blbl-blog/p/18676524

相关文章

  • SQL-按自定义格式进行编号的SQL自定义函数.090119
    生成格式如:DT.EMP.0000000001的自增emp_id,加入EmpBaseINfo表中。--生成格式如DT.EMP.0000000001  【Vegas Add】ALTERFUNCTION[dbo].[Get_EmpBaseInfo_AccountID](@RowIDasint)RETURNSnvarchar(50) as begin    declare@oidnvarchar(50)    dec......
  • 【ABKing】记一次Python SSTI的内存马技术研究
    通过对PythonSSTI的技术研究,发现网上的一些Payload具有局限性,并非能直接使用,踩了一些坑,写出了自己的独创Payload0x00起因有个用户单位反馈,HW期间被攻击队打了个RCE,并且提供了攻击队的报告和防火墙的流量。正好临近年关,闲来无事,想到已经很久没有认真钻研技术了,遂开始进行研究。......
  • SQL-update多条Select出来的数据.090205
    好多朋友喜欢用游标解决此问题,但是执行速度狂慢!其实解决起来很简单了:先来个简单的:把FLowER的Am_employee表的email,dept_id,ext_no多条数据按emp_no对应update到EmpBaseInfo表中:update EmpBaseInfo set email=b.Mail_account,dept_id=b.dept_code,ext_no=b.ext_nofro......
  • Qt以共享内存方式限制应用多开
    1.创建共享内存,如果键所标识的共享内存段已经存在,则不执行附加操作,并返回false。#include<QApplication>#include<QSharedMemory>#include<QMessageBox>intmain(intargc,char*argv[]){QApplicationa(argc,argv);//"AK"键staticQSharedMemory......
  • Winserver用指令批量添加修改AD域控用户.210702
    实践证明,批处理啥的,真的没有ExcelVlookup快。做以下步骤前,记得用好Excel,用公式把内容拼接好,然后愉快地玩耍。1.查找现在OU下的所有用户dsqueryuserou=ZTGM,dc=zt,dc=com-limit0>1.txt2.新增用户:dsadduser指令dsadduser"CN=叶是,OU=采购中心,OU=ZTGM,DC=zt,DC=com"......
  • mysql-8.0.40二进制单节点部署
    1、下载二进制包https://dev.mysql.com/downloads/mysql/选择mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz2、部署cd/opttarxfmysql-8.0.40-linux-glibc2.28-x86_64.tar.xzgroupaddmysqluseradd-gmysql-s/sbin/nologin-Mmysqlmkdir/data/mysql-8.0.40/{data,......
  • 一文让你对mysql索引底层实现明明白白
    作者:京东零售韩航云开篇:图片是本人随笔画的,有点粗糙,望大家谅解,如有不对的地方,请联系本人,感谢一、索引到底底是什么.索引是帮助mysql高效获取数据的排好序的数据结构.索引是存储在文件里的.数据结构:二叉树HASHBTREE  如果没有索引的话,循环一条一条的找,找一次就是一......
  • Linux内存泄露案例分析和内存管理分享
    作者:京东科技李遵举一、问题近期我们运维同事接到线上LB(负载均衡)服务内存报警,运维同事反馈说LB集群有部分机器的内存使用率超过80%,有的甚至超过90%,而且内存使用率还再不停的增长。接到内存报警的消息,让整个团队都比较紧张,我们团队负责的LB服务是零售、物流、科技等业务服务的流......
  • 使用 wx-server-sdk
    在云函数中使用wx-server-sdk云函数属于管理端,在云函数中运行的代码拥有不受限的数据库读写权限和云文件读写权限。需特别注意,云函数运行环境即是管理端,与云函数中的传入的openId对应的微信用户是否是小程序的管理员/开发者无关。云函数中使用wx-server-sdk需在对应云函......
  • 请问WebSql是HTML5的一个规范吗?
    WebSQL并不是HTML5的一个规范。尽管它常常与HTML5的技术栈一起被提及,但WebSQL本身是基于SQLite的一个独立规范,引入了一组使用SQL操作客户端数据库的API。这些API允许前端开发者在浏览器中创建、读取、更新和删除数据库中的数据,从而提供了一种在客户端存储和管理数据的机制。然而,......