admin 管理员组文章数量: 1184232
问题背景
我们的报盘程序使用的是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版权协议,转载请附上原文出处链接及本声明。
原文链接:
解决办法
查看内存状态:
DBCC MemoryStatus
这些内存一般都是Sql Server运行时候用作缓存的:
- 数据缓存:执行个查询语句,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版权协议,转载请附上原文出处链接及本声明。
原文链接:
方法一: 限制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),定时自动执行上面新建的批处理文件。
首先,进入控制面板,点击“查看方式”选“小图标”
接着,单击管理工具进入界面,双击“计划任务程序”,进入如下界面
再接着,单击创建任务,并输入任务名称,点确定保存
再接着,新建触发器,设置好后,点确定保存
提醒:开始时间一定设置成空闲时间
最后,新建操作,点击浏览按钮,选择刚刚建好的批处理文件ResetSqlServer.bat
版权声明:本文标题:内存危机四伏?快速解决SQL Server占用高内存问题指南 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1770656041a3536130.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论