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_clerks、sys.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. 2023NOIP A层联测28 T4 小猫吃火龙果

    2023NOIP A层联测28 T4 小猫吃火龙果 分块题,跟赛时的一个倍增部分分做法很像. 思路 如果没有动态操作,可以设 \(dp[i][T][k]\) 为:在 \(i\) 时为 \(T(T\in ...

  2. ubuntu如何安装redis

    在终端下输入 sudo apt search redis 查找一下发现了 redis-server 如果找不到 你可能需要使用 update 更新一下了 sudo apt-get update 然后就 ...

  3. 敏捷开发:Scrum 中的 Product Backlog 介绍

    Product Backlog 产品待办列表 在计划开发产品功能时,都希望产品功能上线后,用户能够喜欢并经常使用. 因此在开发产品新功能时,就要衡量哪些产品需求是对用户最有价值,这是最应该思考的问题. ...

  4. ADMM——交替方向乘子法

    ADMM(Alternating Direction Method of Multipliers,交替方向乘子法)是一种优化算法,主要用于解决分布式.大规模和非光滑的凸优化问题.ADMM通过将原始问题 ...

  5. golang之路由库gorilla/mux

    gorilla/mux是 gorilla Web 开发工具包中的路由管理库.gorilla Web 开发包是 Go 语言中辅助开发 Web 服务器的工具包.它包括 Web 服务器开发的各个方面, 有表 ...

  6. Django之gunicorn部署

    安装: pip install gunicorn 启动应用: gunicorn -w 3 -k gthread -e DJANGO_SETTINGS_MODULE=settings.prod Serv ...

  7. git代码同步,代码同步到码云中

    首先在需要同步的代码根目录下打开终端,这里是在vscode的终端操作的,也可以用cmd 进入到项目目录,输入git status查看代码同步状态, 提示内红色的都是有变化的代码 git status ...

  8. 当年的毕设-cpf (一个简易的协议 fuzzer)

    整理文件时发现了这个,看是否有人需要... https://github.com/hac425xxx/cpf/ cpf 一个简单的协议Fuzz工具. 毕设答辩胶片&演示视频 https://g ...

  9. C++顺序结构(2)学习任务

    在坚果云中注册免费个人云盘 一.视频下载存放在规划好的文件夹中,并观看学习 1.变量存储.注释 2.四则运算.输入 3.认识设置DEV-C++ 4.第一个C++程序 5.头文件 6.命名空间 7.co ...

  10. SQL语句报com.alibaba.druid.sql.parser.ParserException: TODO IDENTIFIER cross

    这个错误根据网络上人员说是解析出错!虽然报错但不影响结果!但是报错了就是看的不爽!把druid包换成druid-1.0.9.jar就解决这个问题了!至于性能暂时还没测试到