SQL Server 2005 有关过程缓存的问题

SQL Server 2005 有关过程缓存的问题

服务器:SQL Server 2005 SP2 64 位,32 GB 内存。正在运行 2 个 SQL 服务器实例。我使用的主实例有 20 GB 可见内存。

我们遇到过这种情况,我们的整个过程缓存经常被清除,这反过来又迫使存储过程 (sp) 重新编译。一旦 sp 进入缓存,一切都会运行得很快。几个小时后,它会从缓存中清除,必须重新编译,导致运行速度短暂变慢。

我正在使用以下方法观察缓存:

SELECT cp.objtype AS PlanType,
OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
cp.refcounts AS ReferenceCounts,
cp.usecounts AS UseCounts,
st.TEXT AS SQLBatch,
qp.query_plan AS QueryPlan
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
GO

DBCC FREEPROCCACHE 从未被调用。

如果我运行 DBCC MEMORYSTATUS,我可以看到过程缓存的 TotalPages 约为 500k 页。这相当于分配给缓存 3.9 GB。参考:SQL Server 2008 中的计划缓存(有关缓存的部分包括 2005 SP 2)。它表示压力限制应为 4.6 GB。(0-4GB 的可见目标内存的 75% + 4GB-64GB 的可见目标内存的 10% + 大于 64GB 的可见目标内存的 5%...3GB + 1.6GB = 4.6GB)

这似乎表明我们不应该再承受 700 MB 的缓存压力。如果统计数据发生变化,则存储过程应该仍在缓存中,并在下次运行时重新编译并检查统计数据。如果是这样的话,我希望缓存保持几乎恒定的大小。

有什么想法可能导致过程缓存为空或我还应该注意什么以尝试找出原因?

答案1

第二个实例上是否配置了 max_server_memory?或者更重要的是,两个实例的最大内存设置的总和是否小于服务器中的总内存?如果不是,则一个实例可能正在窃取另一个实例的内存。

相关内容