日期:2014-05-17  浏览次数:20593 次

sqlserver内存不断增长的问题
情况是这样的,
我写了一些存储过程,压力测试的时候数据库占的内存会不断增加
1. 没有使用游标,所以没有忘释放的游标

2. 数据量比较大,采用的是增量运算,每次记下上一次计算的最后一条,然后从后一条开始匹配和计算
3. 计算量比较大(sql里面进行的大量的join操作,以及对数据的统计),大量用到了临时表
4. sqlserver内存增长很快,设置了最大可占用的内存数,但是无效,会突破那个值继续增加
5. 停止全部操作之后,内存不会下降
6. 每句话后面尝试了commit,内存还是增长很快

我想请问一下,怎样才能控制内存的增长?  无论是强迫其回收或者设置最大值都可以
------解决方案--------------------
存储过程编辑后,会保留在内存里.
试试:
--强制释放内存  
--清除所有缓存  
DBCC DROPCLEANBUFFERS  
--打开高级配置  
exec sp_configure 'show advanced options', 1  
--设置最大内存值,清除现有缓存空间  
exec sp_configure 'max server memory', 256  
EXEC ('RECONFIGURE')  
--设置等待时间  
WAITFOR DELAY '00:00:01'  
--重新设置最大内存值  
EXEC  sp_configure 'max server memory', 4096  
EXEC ('RECONFIGURE')  
--关闭高级配置  
exec sp_configure 'show advanced options',0  
GO  

------解决方案--------------------
mssql服务器的总体内存占用量是可以设置上限的:服务器的属性-内存里
------解决方案--------------------
1、限制内存大小,如下图,特别是最大内存:

2、了解内存大的原因,任何关系数据库管理系统都占内存,因为要缓存大量数据和执行计划。
3、可以使用性能计数器做一个长时间的监控,看看内存的行为是否正常,如何使用最好参考:《SQLServer 2008 企业级平台管理》。
4、优化各个代码,使其运行时占用更少资源。
5、在预算允许的情况下,增大物理内存。
------解决方案--------------------
在sql server服务器属性设置可以控制内存值的大小的,大量的内存缓存的sql server的查询数据。
只有停止服务就可以释放缓存中占有的内存,commit只能代表事物的结束。

------解决方案--------------------
内存增长是正常的,而且'max server memory'只是限制BUFFER POOL的大小,还有其他的部分会使用内存,所以总的内存使用会大于'max server memory'
------解决方案--------------------
楼主啊,数据库内存使用量随使用而增长很正常的,数据库会根据一定的策略尽量地把经常访问的数据块放在内存里,以减少磁盘IO带来的性能瓶颈。