情况是这样的,
我写了一些存储过程,压力测试的时候数据库占的内存会不断增加
1. 没有使用游标,所以没有忘释放的游标2. 数据量比较大,采用的是增量运算,每次记下上一次计算的最后一条,然后从后一条开始匹配和计算
3. 计算量比较大(sql里面进行的大量的join操作,以及对数据的统计),大量用到了临时表
4. sqlserver内存增长很快,设置了最大可占用的内存数,但是无效,会突破那个值继续增加
5. 停止全部操作之后,内存不会下降
6. 每句话后面尝试了commit,内存还是增长很快我想请问一下,怎样才能控制内存的增长? 无论是强迫其回收或者设置最大值都可以
我写了一些存储过程,压力测试的时候数据库占的内存会不断增加
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
3、可以使用性能计数器做一个长时间的监控,看看内存的行为是否正常,如何使用最好参考:《SQLServer 2008 企业级平台管理》。
4、优化各个代码,使其运行时占用更少资源。
5、在预算允许的情况下,增大物理内存。
只有停止服务就可以释放缓存中占有的内存,commit只能代表事物的结束。
爆出如上的错误
重启sqlserver之后设置的上限值不起作用
如果要限制内存,可以使用max server memory来配置buffer pool最大内存上限,这个基本上也就限制了SQL Server内存,SQL 其它部分占用的内存相对来讲比较少的。
是测试机?数据库文件有多大?
这只是做个测试而已,个人电脑的虚拟机里,不到10分钟已经到1G以上了,真实server上的速度要快得多