SQL Sever内存占用高,如何解决

数据库技术 同时被 2 个专栏收录
8 篇文章 0 订阅
55 篇文章 1 订阅

问题背景

我们的报盘程序使用的是SQL Server服务器,报盘程序运行几个小时后,经常发现服务器上80%以上的内存都被数据库给占用了,导致整个服务器的物理内存使用率接近95%以上。整个服务器运行速率都受到影响。

SQL Server使用内存的技术细节

经上午查询,SQL Server使用数据库是比较贪婪的。具体细节如下
扩展:(转自网络)

由于Sql Server对于系统内存的管理策略是有多少占多少,除非系统内存不够用了(大约到剩余内存为4M左右),Sql Server才会释放一点点内存。所以很多时候,我们会发现运行Sql Server的系统内存往往居高不下。这些内存一般都是Sql Server运行时候用作缓存的,例如你运行一个select语句,那么Sql Server会将相关的数据页(Sql Server操作的数据都是以页为单位的)加载到内存中来,下一次如果再次请求此页的数据的时候,就无需读取磁盘了,大大提高了速度。这类的缓存叫做数据缓存。还有一些其他类型的缓存,如执行存储过程时,Sql Server需要先编译再运行,编译后的结果也会缓存起来,下一次就无需再次编译了。

这就解释了上文问题为什么发生。

————————————————
版权声明:本文为CSDN博主「东东不邪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/donghustone/article/details/83338185

解决办法

查看内存状态:
DBCC MemoryStatus

这些内存一般都是Sql Server运行时候用作缓存的:

  1. 数据缓存:执行个查询语句,Sql Server会将相关的数据页(Sql Server操作的数据都是以页为单位的)加载到内存中来, 下一次如果再次请求此页的数据的时候,就无需读取磁盘了,大大提高了速度。

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

可以调用以下几个DBCC管理命令来清理这些缓存:

DBCC FREEPROCCACHE 清除存储过程相关的缓存
DBCC FREESESSIONCACHE 会话缓存
DBCC FREESYSTEMCACHE(‘All’) 系统缓存
DBCC DROPCLEANBUFFERS 所有缓存

但是,这几个命令虽然会清除掉现有缓存,为新的缓存腾地方,但是Sql server并不会因此释放掉已经占用的内存。Sql Server并没有提供任何命令允许我们释放不用到的内存。因此我们只能通过动态调整Sql Server可用的物理内存设置来强迫它释放内存。
————————————————
版权声明:本文为CSDN博主「怒彬」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shenwb110/article/details/74987577

方法一: 限制SQL Server使用内存的上限

在这里插入图片描述
在这里插入图片描述

方法二:使用以下语句查找出什么语句占内存最高

使用以下语句查找出什么语句占内存最高,针对占内存高的语句进行优化
SELECT SS.SUM_EXECUTION_COUNT,
T.TEXT,
SS.SUM_TOTAL_ELAPSED_TIME AS ‘总和时间’,
SS.SUM_TOTAL_WORKER_TIME AS ‘执行耗时’,
SS.SUM_TOTAL_LOGICAL_READS AS ‘总和逻辑读数’,
SS.SUM_TOTAL_LOGICAL_WRITES AS ‘总和逻辑写’
FROM (SELECT S.PLAN_HANDLE,
SUM(S.EXECUTION_COUNT)SUM_EXECUTION_COUNT,
SUM(S.TOTAL_ELAPSED_TIME)SUM_TOTAL_ELAPSED_TIME,
SUM(S.TOTAL_WORKER_TIME)SUM_TOTAL_WORKER_TIME,
SUM(S.TOTAL_LOGICAL_READS)SUM_TOTAL_LOGICAL_READS,
SUM(S.TOTAL_LOGICAL_WRITES)SUM_TOTAL_LOGICAL_WRITES
FROM SYS.DM_EXEC_QUERY_STATS S
GROUP BY S.PLAN_HANDLE
) AS SS
CROSS APPLY SYS.dm_exec_sql_text(SS.PLAN_HANDLE)T
ORDER BY SUM_TOTAL_LOGICAL_READS DESC

方法三

设置完后,运行一段时间以后另一个问题又出现了,虽然服务器运行一段时间以后数据库把配置的内存吃完了,但是不会出现服务器死机卡顿现象,可应用服务程序运行还是会慢。

啊啊啊 249a21a4fa51df9be5ad04048b5fb139.png249a21a4fa51df9be5ad04048b5fb139.png249a21a4fa51df9be5ad04048b5fb139.png 只能出大招了

设置周期性重启SQL Server 2012 R2服务,下面给大家介绍一下方法:

1、建立一个重启SQL Server 2012 R2服务批处理文件。

首先,新建一个txt文档

接着,在刚才建的文档中输入一下命令

net stop sqlserveragent
net stop mssqlserver
net start mssqlserver
net start sqlserveragent

最后,保存文件名为ResetSqlServer,扩展名为bat

2、设置一个计划任务(我服务器系统是Wondows Server 2012),定时自动执行上面新建的批处理文件。

首先,进入控制面板,点击“查看方式”选“小图标”

800be885c1b53bf6b8ff710b6237061a.png

接着,单击管理工具进入界面,双击“计划任务程序”,进入如下界面

ca1e6b6a82a23545d21aa27b4a6a9861.png

再接着,单击创建任务,并输入任务名称,点确定保存

262aa285093ae5df448d0585181747e1.png

再接着,新建触发器,设置好后,点确定保存

在这里插入图片描述

提醒:开始时间一定设置成空闲时间

最后,新建操作,点击浏览按钮,选择刚刚建好的批处理文件ResetSqlServer.bat

2131818b80c6bd66c8d97f1849015bd1.png

  • 0
    点赞
  • 5
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

pfm685757

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值