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