Total Use Count 1
--------------------------------------- -----------------------
Total Plans Total MBs Avg Use Count Total Plans Total MBs
----------- --------- ------------- ----------- ---------
Adhoc 55,987 3,054 3 38,314 2,036
Proc 709 1,502 1,549 135 527
我的建议是寻找比计划缓存命中率更好的确凿证据。获取有关用户性能投诉的更多细节。所有查询总是很慢吗?某些查询?一天/一周/商业周期的特定时间?仅报告查询很慢吗?认真阅读这份关于 SQL Server 最佳实践的枯燥而冗长的文档- 特别是关于等待和队列的部分,它可以帮助您制定一种逻辑方法来识别、诊断和解决性能问题。让仪表板上的一些数字看起来更好——一个你甚至不知道直接导致问题的数字——可能会非常令人满意,但如果它不能解决用户的性能问题,那么它并没有真正让你受益任何地方。
让我总结(并四舍五入!)电子表格中的重要数据点:
所以第一行显示了不好的东西,占用了大约 2/3 的计划缓存(大部分只使用过一次的东西,有一些非常小的例外)。您需要尝试尽可能多地摆脱这些。第二行显示好东西。这些是您想要在计划缓存中的东西(具有大量重用的计划)。其余的数据在很大程度上与恕我直言无关。不过还有一点:您说访问是专门通过存储过程进行的,但是如果这些过程使用动态 SQL,那么这些语句将被缓存为
AdHoc
计划,而不是Proc
计划。在 2008 年或更高版本上,我会说打开
optimize for ad hoc workloads
并继续处理下一个问题 - 这将使您的一次性计划当前占用的 MB 数量几乎为零。不幸的是,在 2005 年,您的选择非常有限,除了重构那些存储过程以使用语句级和/或更少/无动态 SQL,或在数据库级别OPTION (RECOMPILE)
打开强制参数化- 这试图获得更好的计划重用通过将文字视为用于计划匹配目的的参数来进行类似的查询。我什至不愿提及计划指南,因为它们不适合胆小的人,并且-正如我稍后在此答案中讨论的那样-除非您知道计划缓存绝对是性能的来源,否则我不确定是否值得走这条路问题。我之所以问,是
@@VERSION
因为在 SP2 之前,可以分配给计划缓存的内存量的算法相对宽松。从 SP2 开始,他们将其收紧了很多(在这篇文章和这篇文章中记录和解释了这些变化)。在您的情况下,计划缓存相对已满,因此您遇到缓存未命中也就不足为奇了。26 GB = 上限为 5.8 GB;我在电子表格中看到了 ~4.5 GB,但这里可能存在一些我不知道的计算或配置差异。这篇 MSDN 文章讨论了
optimize for ad hoc workloads
2008 年添加的服务器设置,并提到了跟踪标志 8032,这将允许您为缓存分配更多内存(大概是在没有在服务器级别设置此设置的情况下,我现在向所有人推荐我们的客户,或者至少 99% 不再是 2005 年的客户)。我从来没有在 2005 SP3 或 SP4 上测试过这个跟踪标志,老实说,我什至不确定它是什么时候引入的。我也不知道它是否会解决您的问题或只是转移它,因为我认为即使您为缓存分配了更多 % 的 RAM,由于你的存储过程。或者,当然,如果有一个与计划缓存直接相关的问题需要解决。仅仅因为您的缓存命中率没有您预期的那么高并不意味着它会导致您的问题,当然相反的是,即使在 100% 的缓存命中率下 - 这似乎并不现实,因为有这么多您的计划是一次性的和临时的 - 您的用户可能仍然遭受完全由其他原因引起的性能问题。
我的建议是寻找比计划缓存命中率更好的确凿证据。获取有关用户性能投诉的更多细节。所有查询总是很慢吗?某些查询?一天/一周/商业周期的特定时间?仅报告查询很慢吗?认真阅读这份关于 SQL Server 最佳实践的枯燥而冗长的文档- 特别是关于等待和队列的部分,它可以帮助您制定一种逻辑方法来识别、诊断和解决性能问题。让仪表板上的一些数字看起来更好——一个你甚至不知道直接导致问题的数字——可能会非常令人满意,但如果它不能解决用户的性能问题,那么它并没有真正让你受益任何地方。
这些也可能有助于阅读编译/重新编译和计划缓存重用。其中一些集中在 2008 年(特别是关于临时工作负载设置的那些),但大部分信息对于 2005 年和/或更好地理解升级的好处(提示,提示)仍然有用。