低计划缓存

时间:2015-03-10 19:26:50

标签: sql-server caching sql-server-2008-r2

我的问题是:为什么SQL服务器分配给Plan Cache的内存量很少?而且,如果需要进行修正,可以采取哪些措施来纠正这个问题?

我们有一个SQL服务器,每秒Compilations问题很高,表明没有足够的执行计划被缓存使用(当我们运行sp_AskBrent @ ExpertMode = 1,@ Seconds = 30 [来自brentozar.com/时首次检测到] askbrent /]).

我们在服务器上运行了SQL Live Monitor应用程序(https://sqlmonitor.codeplex.com/),并且计划缓存结果显示分配给缓存执行计划的内存量非常低(355.27 MB),因此计划缓存命中率较低(在5%到50%之间变化)。

我的研究表明,分配给Plan Cache的内存不是可配置的数量,而是基于分配给SQL实例的内存的计算。因此,对于总共48GB和40GB分配给SQL的服务器,(.75 * 4GB)+(。1 * 36GB)的计算应该为Plan Cache分配6.6GB。我的计算得当吗?

值得注意的是,该服务器只有一个生产数据库,该数据库的大小为50GB。我们将Optimize for Ad hoc Workloads设置为True,并将数据库级别的Parameterization设置为Forced。 与另一台SQL服务器(总共32GB和26GB分配)相比,Plan Cache数量看起来更合理(4GB大小,命中率超过80%。

此外,针对两个SQL服务器运行下面的脚本始终显示问题服务器的命中率在中间70%范围内,而另一个服务器在90%范围内显示命中百分比。

WITH    cte1 
          AS ( SELECT [dopc].[object_name] , 
                    [dopc].[instance_name] , 
                    [dopc].[counter_name] , 
                    [dopc].[cntr_value] , 
                    [dopc].[cntr_type] , 
                    ROW_NUMBER() OVER ( PARTITION BY [dopc].[object_name], [dopc].[instance_name] ORDER BY [dopc].[counter_name] ) AS r_n 
                FROM [sys].[dm_os_performance_counters] AS dopc 
                WHERE [dopc].[counter_name] LIKE '%Cache Hit Ratio%' 
                    AND ( [dopc].[object_name] LIKE '%Plan Cache%' 
                          OR [dopc].[object_name] LIKE '%Buffer Cache%' 
                        ) 
                    AND [dopc].[instance_name] LIKE '%_Total%' 
             ) 
    SELECT CONVERT(DECIMAL(16, 2), ( [c].[cntr_value] * 1.0 / [c1].[cntr_value] ) * 100.0) AS [hit_pct] 
        FROM [cte1] AS c  
            INNER JOIN [cte1] AS c1 
                ON c.[object_name] = c1.[object_name] 
                   AND c.[instance_name] = c1.[instance_name] 
        WHERE [c].[r_n] = 1 
            AND [c1].[r_n] = 2;

1 个答案:

答案 0 :(得分:0)

见:

  

...所有缓存的最大大小是缓冲池大小的函数,不能超过最大服务器内存...   (https://technet.microsoft.com/en-us/library/ms181055%28v=sql.105%29.aspx

如果您主要运行adhoc查询,我认为optimize for ad hoc workloads选项会有所帮助:

sp_configure 'show advanced options',1
GO
reconfigure
GO
sp_configure 'optimize for ad hoc workloads',1
GO
reconfigure
GO
DBCC FREEPROCCACHE
GO

不要先在Prod服务器上尝试,特别是FREEPROCCACHE