【问题标题】:Is there a way to prevent repeat calls of a SQL query from caching and being quicker?有没有办法防止 SQL 查询的重复调用缓存和更快?
【发布时间】:2013-11-16 16:58:16
【问题描述】:

我需要在约 1-2 秒内运行多个查询。我一直在努力优化它们,但是第一次调用它们需要大约 20 秒,而所有后续调用需要大约 1 秒。这使得无法判断我所做的任何更改是否正在加快查询速度,因为它总是在大约 1 秒后运行。我对 SQL 并不是非常熟悉,但从我所学到的东西来看,似乎有些东西正在缓存。我试图弄清楚如何防止这种情况,但似乎没有任何效果。根据我在 Google 上的发现,人们一直在建议

DBCC FREEPROCCACHE

OPTION(recompile)

这些似乎都不起作用。每个查询在第一次耗时约 20 秒时仍在约 1 秒内运行。我只是想确保我所做的更改正在导致改进,而不是改进来自缓存。有没有其他技巧可以做到这一点?

【问题讨论】:

  • 那么,您希望每次运行查询需要大约 20 秒吗?为什么?
  • 是的,我只想要一致的结果,所以当我做一个小改动时,我会确保它不是因为缓存。
  • 您是想在初始运行时阻止 ~20 运行时间,还是减慢其他查询的速度?
  • 他想减慢其他查询以进行性能测试。我有同样的问题:当缓存改变查询运行时,很难知道您的更改是否有助于提高性能。

标签: sql sql-server


【解决方案1】:

DBCC FREEPROCCACHE 用于计划缓存(查询编译),这可能是您查询中的一个小收获,而不是页面缓冲区数据缓存,这是对 IO 的重大改进。 为了保持一致,您需要清除缓冲区缓存,在数据库中完成检查点之后,使用

CHECKPOINT
DBCC DROPCLEANBUFFERS

【讨论】:

    【解决方案2】:

    今天在巴塞尔的技术日活动中,一位 SQL 专业人士确实使用了上述 2 条建议的组合:

    DBCC DROPCLEANBUFFERS
    DBCC FREEPROCCACHE
    

    所以我认为它应该可以工作:-)

    【讨论】:

      【解决方案3】:

      后续运行速度更快的原因是执行计划被缓存了。您对代码所做的更改要么不够重要,以至于需要重新编译,它们实际上正在运行。尝试在启用客户端统计信息的情况下测试每次运行。 Management Studio 中执行图标旁边的顶部有一个按钮,您可以打开/关闭。

      编辑:打开客户端统计信息的更清晰说明:在顶部菜单中,单击查询 > 包括客户端统计信息。

      【讨论】:

        【解决方案4】:

        你应该试试 dbcc dropcleanbuffers (MSDN:Use DBCC DROPCLEANBUFFERS to test queries with a cold buffer cache without shutting down and restarting the server.)

        我认为您看到的效果不是因为缓存的查询计划,而是因为 sql server 在您第一次执行查询时缓存了查询结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-17
          • 1970-01-01
          • 1970-01-01
          • 2021-08-26
          • 2012-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多