AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 57313
Accepted
AngryHacker
AngryHacker
Asked: 2014-01-23 10:43:48 +0800 CST2014-01-23 10:43:48 +0800 CST 2014-01-23 10:43:48 +0800 CST

如何提高过程缓存命中率?

  • 772

据我所知,低于 95% 的过程缓存命中率是一个问题。在我的盒子里,数值在 85% 到 95% 之间徘徊。

我该如何解决这个问题?服务器似乎有足够的内存,所以这应该不是问题。还能是什么?

sql-server performance
  • 1 1 个回答
  • 10030 Views

1 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2014-01-23T17:20:27+08:002014-01-23T17:20:27+08:00

    让我总结(并四舍五入!)电子表格中的重要数据点:

          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
    

    所以第一行显示了不好的东西,占用了大约 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 workloads2008 年添加的服务器设置,并提到了跟踪标志 8032,这将允许您为缓存分配更多内存(大概是在没有在服务器级别设置此设置的情况下,我现在向所有人推荐我们的客户,或者至少 99% 不再是 2005 年的客户)。我从来没有在 2005 SP3 或 SP4 上测试过这个跟踪标志,老实说,我什至不确定它是什么时候引入的。我也不知道它是否会解决您的问题或只是转移它,因为我认为即使您为缓存分配了更多 % 的 RAM,由于你的存储过程。

    或者,当然,如果有一个与计划缓存直接相关的问题需要解决。仅仅因为您的缓存命中率没有您预期的那么高并不意味着它会导致您的问题,当然相反的是,即使在 100% 的缓存命中率下 - 这似乎并不现实,因为有这么多您的计划是一次性的和临时的 - 您的用户可能仍然遭受完全由其他原因引起的性能问题。

    我的建议是寻找比计划缓存命中率更好的确凿证据。获取有关用户性能投诉的更多细节。所有查询总是很慢吗?某些查询?一天/一周/商业周期的特定时间?仅报告查询很慢吗?认真阅读这份关于 SQL Server 最佳实践的枯燥而冗长的文档- 特别是关于等待和队列的部分,它可以帮助您制定一种逻辑方法来识别、诊断和解决性能问题。让仪表板上的一些数字看起来更好——一个你甚至不知道直接导致问题的数字——可能会非常令人满意,但如果它不能解决用户的性能问题,那么它并没有真正让你受益任何地方。

    这些也可能有助于阅读编译/重新编译和计划缓存重用。其中一些集中在 2008 年(特别是关于临时工作负载设置的那些),但大部分信息对于 2005 年和/或更好地理解升级的好处(提示,提示)仍然有用。

    • http://technet.microsoft.com/en-us/library/ms181055(v=sql.90).aspx
    • http://www.sqlperformance.com/2013/08/t-sql-queries/parameter-sniffing-embedding-and-the-recompile-options
    • http://technet.microsoft.com/en-us/library/ee343986(v=sql.100).aspx
    • http://www.sqlskills.com/blogs/kimberly/plan-cache-and-optimizing-for-adhoc-workloads/
    • http://www.sqlskills.com/blogs/kimberly/plan-cache-adhoc-workloads-and-clearing-the-single-use-plan-cache-bloat/
    • http://www.sqlskills.com/blogs/kimberly/clearing-the-cache-are-there-other-options/
    • http://www.sqlskills.com/blogs/kimberly/exec-and-sp_executesql-how-are-they-different/
    • http://www.sqlskills.com/blogs/kimberly/prepared-statements-and-caching/
    • http://www.sommarskog.se/query-plan-mysteries.html
    • http://www.sommarskog.se/dynamic_sql.html
    • 19

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve