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%),设置成功后重启

四、 其他

结果集图片:执行 DBCC MemoryStatus

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

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

SQL Server 内存占用高分析及解决办法(超详细)的更多相关文章

  1. Sql Server 2008 卸载重新安装失败的解决办法!(多次偿试,方法均有效!)

    Sql Server 2008 卸载重新安装失败的解决办法!(多次偿试,方法均有效!) 1.控制面板中卸载所有带sql server的程序. 2.在C盘C:\Program Files中sqlserv ...

  2. 在Windows2008下安装SQL Server 2005无法启动服务的解决办法

    在Windows2012下安装SQL Server 2005无法启动服务的解决办法 1.正常安装任一版本的SQL Server 2005. 2.安装到SqlServer服务的时候提示启动服务失败  此 ...

  3. Sql Server 阻塞的常见原因和解决办法

    1. 由于语句运行时间太长而导致的阻塞,语句本身在正常运行中,只须等待某些系统资源 解决办法: a. 语句本身有没有可优化的空间 b. Sql Server 整体性能如何,是不是有资源瓶颈影响了语句执 ...

  4. sql server 2008 评估期已过期解决办法

    开始-->所有程序-->Microsoft SQL Server 2008-->配置工具-->SQL Server 安装中心-->维护-->版本升级,接着按照提示一 ...

  5. mds的cpu占用问题分析以及解决办法

    前言 mds是ceph里面处理文件接口的组件,一旦使用文件系统,不可避免的会出现一种场景就是目录很多,目录里面的文件很多,而mds是一个单进程的组件,现在虽然有了muti mds,但稳定的使用的大部分 ...

  6. C#内存占用大量资源的解决办法

    昨天,独立完成了一个项目,一直运行起,起初运行内存为15Mb左右,但是发现内存以每秒2Mb的速度增加,吓了我一跳(注:我实习生,我的工作中第一个项目).从头找寻对象,再来dispose,弄得我晕头转向 ...

  7. 在Windows2012下安装SQL Server 2005无法启动服务的解决办法

    下面是我亲自经历过的总结. 因为尝鲜安装了Windows2012,的确很不错,唯一的遗憾就是不支持Sql Server 2005的安装.找了很多办法,基本上都有缺陷.现在终于找到一种完全正常没有缺陷的 ...

  8. SQL Server 2008安装失败问题以及解决办法

    一.检测过程中重启失败解决办法 在键盘上按下组合键[Win]+[R],调出运行窗口. 在窗口中输入“regedit”,点击确定,打开注册表管理界面. 在注册表左侧目录栏中找到如下位置:“HKEY_LO ...

  9. SQL Server 2008 忘记sa密码的解决办法

    由于某些原因,sa和windows验证都不能登录 sql server,可以用独占模式,修改sa密码先在服务管理器停止Sql Server服务,然后打开命令行,进入 SQL Server安装目录,进入 ...

  10. (转)SQL Server 2008无法修改表的解决办法

    转自:http://www.soaspx.com/dotnet/sql/mssql/sql2008/sqlserver2008_20121010_9683.html 在SQL Server 2008 ...

随机推荐

  1. 访问浪潮带外BMC界面的远程控制台重定向(KVM)无法访问,提示JViewer未签名,mac电脑安装JDK8

    报错截图: 安装JDK8 下载JDK1.8的安装包 Java Downloads | Oracle 下载的安装包双击按提示流程安装: 按照完成以后.我们可以查看JDK的安装路径.在资源库/Librar ...

  2. rpmbuild命令RPM包制作kafka示例SPEC

    kafka的自定义安装路径RPM包制作 # 编写SPEC cat kafka.spec BuildArch: noarch Name: kafka_2.11 Version: 2.1.0 Releas ...

  3. CSP模拟50联测12 T2 赌神

    CSP模拟50联测12 T2 赌神 题面与数据规模 Ps:超链接为衡水中学OJ. 思路 \(subtask2\): 由于\(x_i\)较小,考虑 dp. 假设一开始球的颜色为红和蓝,设 \(dp[i] ...

  4. Linux系统进程

    系统进程 [1].进程基本概述 当我们运行一个程序,那么我们将运行的程序叫进程 ​ PS1:当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限 ​ PS2:在进程运行的过程中,服务器 ...

  5. golang之Time时间函数

    在编程中,我们经常会遭遇八小时时间差问题.这是由时区差异引起的,为了能更好地解决它们,我们需要理解几个时间定义标准. GMT(Greenwich Mean Time),格林威治平时.GMT 根据地球的 ...

  6. python之高级数据结构Collections

    1. Collections collections模块包含了内建类型之外的一些有用的工具,例如Counter.defaultdict.OrderedDict.deque以及nametuple.其中C ...

  7. 4-CSRF漏洞渗透与防御

    1.什么是CSRF漏洞 Cross-Site Request Forgery 跨站请求伪造 从一个第三方的网站,利用其他网站生效的cookie,直接请求服务器的某一个接口,导致攻击发生! 2.CSRF ...

  8. 论文泛读《T-Miner: A Generative Approach to Defend Against Trojan Attacks on DNN-based Text Classification》

    发表时间:2021 期刊会议:30th USENIX Security Symposium 论文单位:Virginia Tech 论文作者:Ahmadreza Azizi,Ibrahim Asadul ...

  9. QueryFilter的子字段设定

    QueryFilter有一个SubFields属性和一个AddField方法. 对于SubFields属性是这样描述的.The comma delimited list of field names ...

  10. React使用useRef调用子组件方法

    前情 公司前端主技术栈是react系,最近在提取组件的时候想到vue可以通过ref获取子组件,再调用子组件的方法,于是想在react中实现同样效果. 实现原理 父组件调用useRef获取ref对象,再 ...