隐藏

Sql Server 2008 R2 清理内存的三种方法

发布:2022/8/10 0:03:37作者:管理员 来源:本站 浏览次数:1172

公司最近上线一套系统,运行中发现,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)运行追踪即可。