2024年4月19日发(作者:)
MSSQLServer占用过多内存的解决方法
SQL Server 2008 或者R2的默认内存分配是2147483647MB,
差不多算是无穷大,对于系统内存的管理策略是有多少占多少,除非系统内存不够用了大约
到剩余内存为4M左右,SQL Server才会释放一点点内存;所以很多时候,我们会发现运行
Sql Server的系统内存往往居高不下;
SQLserver会把所有处理过的SQL操作缓存在内存里,这样就不用总去读硬盘了;
例如你运行一个 SELECT 语句,那么SQL Server会将相关的数据页SQL Server操作
的数据都是以页为单位的加载到内存中来,下一次如果再次请求此页的数据的时候,就无需
读取磁盘了,大大提高了速度;这类的缓存叫做数据缓存;还有一些其他类型的缓存,如执行存
储过程时,Sql Server需要先编译再运行,编译后的结果也会缓存起来,下一次就无需再次编
译了;
但是如果长时间运行SQL Server, 系统内存被用的差不多,再开启其他程序就有可能
会报内存不足,因此需要清理内存占用;
方法1:
定期重启下SQL Server 数据库服务,使用任务计划定期执行下边批处理:
net stop sqlserveragent
net stop mssqlserver
net start mssqlserver
net start sqlserveragent
这种方法最简单有效,但是只能临时的清除SQLServer缓存所占的内存空间,时间长了
SQLServer还会把内存占满;而且很重要的是这种方法不能在SQLserver有连接的情况下
使用,那样会让正在使用SQLServer的用户暂时无法连接SQLServer,甚至导致程序处错误;
方法2:
进入Sql server 企业管理器,在数据库服务器名称上点击右键--属性--内存,在右边的
使用AWE分配内存sqlServer64的应该不用勾左边把对勾打上;
在最大服务器内存MB上填入适当的大小,点确定,重启一下Sql服务
方法3:
use master
select lock_timeout
set lock_timeout 900000
-- 15分钟
select lock_timeout
设置数据库每隔15分钟回收闲下来的进程,可以把时间设的短一些
方法4:
从过程高速缓存中删除所有元素
2000里面可以 用DBCC UNPINTABLE,但这个操作不会立即释放表内存Buffer
2005/2008能够更自由的对SQL所占用的内存空间做处理 如
DBCC FREEPROCCACHE
DBCC FREESESSIONCACHE
DBCC FREESYSTEMCACHE&39;All&39;
DBCC DROPCLEANBUFFERS
这几个命令分别用来清除存储过程相关的缓存、会话缓存、系统缓存以及所有所有缓
存;
以上几个命令一般能释放缓存;但是有的时候不是很管用,因为虽然SQLserver会清除
掉现有缓存,为新的缓存腾地方,但是不会因为Cache缓存释放了而释放已经占用的内存,此
命令只会让SQLServer不会继续占领新的内存,无奈的是,Sql Server并没有提供任何命令
允许我们释放不用到的内存;因此我们只能通过
动态调整Sql Server可用的物理内存设置来强迫它释放内存
USE master
GO
EXEC sp_configure &39;show advanced options&39;, 1--开启advanced
options设置开关
GO
EXEC sp_configure &39;max server memory&39;, 5120--最大内存调整为5GB
EXEC &39;RECONFIGURE&39;
WAITFOR DELAY &39;00:00:05&39;
EXEC sp_configure &39;max server memory&39;, 20480--最大内存调整为
20GB
EXEC &39;RECONFIGURE&39;
GO
EXEC sp_configure
options设置开关
GO
&39;show advanced options&39;, 0--关闭advanced


发布评论