发布:2022/8/10 0:03:37作者:管理员 来源:本站 浏览次数:1200
公司最近上线一套系统,运行中发现,SQL Server 2008 R2运行越久,占用内存会越来越大,导致最后不得不重启Sql Server来解决,或者是因为Sql 2008本身内存回收机制做的不够好,所以才只能这么强制回收,已向项目方反馈问题点。
暂时优化方法如下:
1,设置计划脚本,闲时定时重启Sql Server。不得已的选择,如果是生产环境,这样如何得了。
net stop sqlserveragent
net stop mssqlserver
net start mssqlserver
net start sqlserveragent
2,设置AWE内存分配机制。记得以前某个版本启用过AWE,好象效果不好,这样先这样设置上去,观察一段时间。
AWE,address windowsing extensions,这是允许32位应用程序分配64GB物理内存,并把视图或窗口映射到2GB虚拟地址空间的限制。
3,通过定时服务定时检查并自动强制释放内存(但我测试好象几乎没有起作用)。
在SQL Serve Agent-->Jobs-->New Job中新建作业
----自动强制释放内存的SQL脚本
DECLARE @TargetMemory decimal(19,2),@TotalMemory decimal(19,2),@UseMemoryPecent decimal(19,2)
SELECT @TargetMemory=cntr_value FROM sys.dm_os_performance_counters
WHERE counter_name='Target Server Memory (KB)'
SELECT @TotalMemory=cntr_value FROM sys.dm_os_performance_counters
WHERE counter_name='Total Server Memory (KB)'
SET @UseMemoryPecent=@TotalMemory/@TargetMemory
SELECT @UseMemoryPecent
IF @UseMemoryPecent>0.1
BEGIN
--清除存储过程缓存
DBCC FREEPROCCACHE
--清除会话缓存
DBCC FREESESSIONCACHE
--清除系统缓存
DBCC FREESYSTEMCACHE('All')
--清除所有缓存
DBCC DROPCLEANBUFFERS
--打开高级配置
EXEC sp_configure 'show advanced options', 1
--设置最大内存值,清除现有缓存空间 1000 M (根据实际情况设置,具体思路是最大值先调小,然后再设回合适的值。)
EXEC sp_configure 'max server memory', 1000
EXEC ('RECONFIGURE')
--设置等待时间,强制释放内存需等待一些时间
WAITFOR DELAY '00:01:30'
--重新设置最大内存值 3000 M 根据实际情况设置,具体思路是最大值先调小,然后再设回合适的值。)
EXEC sp_configure 'max server memory', 3000
EXEC ('RECONFIGURE')
--关闭高级配置
EXEC sp_configure 'show advanced options', 0
END
4,追踪调试程序,使用SQL Server Profilter追踪异常SQL语句
SSMS-->Tools-->SQL Server Profilter-->New Trace
A)选择标准模版
B)切到“事件选择”进行跟踪设置
1) 只保留如下两个事件选项
2) 点击列筛选
3) 进行详细筛选设置
设置CPU时间作为筛选条件,单位毫秒(用于跟踪耗CPU占用较长的查询,可设置为大于等于某个时间如10000,按CPU内核数1000,可以跟踪CPU占用100%大于1秒的查询)
C)运行追踪即可。