6

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

DBCC FREEPROCCACHE

或者

OPTION(recompile)

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

4

4 回答 4

2

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

CHECKPOINT
DBCC DROPCLEANBUFFERS
于 2013-11-13T22:31:52.437 回答
1

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

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

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

于 2013-11-13T22:00:20.343 回答
0

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

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

于 2013-11-05T18:46:17.073 回答
0

您应该尝试 dbcc dropcleanbuffers (MSDN:使用 DBCC DROPCLEANBUFFERS 使用冷缓冲区缓存测试查询,而无需关闭并重新启动服务器。)

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

于 2013-11-06T06:30:05.537 回答