有没有一种方法可以防止SQL查询的重复调用被缓存并变得更快?

有没有一种方法可以防止SQL查询的重复调用被缓存并变得更快?,sql,sql-server,Sql,Sql Server,我需要在~1-2秒内运行几个查询。我一直在努力优化它们,但第一次调用任何一个都需要约20秒,后续所有调用都需要约1秒。这使得无法判断我所做的任何更改是否加快了查询速度,因为它总是在1秒钟后运行。我对SQL不是非常熟悉,但从我所学到的来看,似乎有什么东西在缓存。我试图找出如何防止这种情况,但似乎没有任何效果。根据我在谷歌上的发现,人们一直在建议 DBCC FREEPROCCACHE 或 但这两种方法似乎都不管用。每个查询在第一次执行时大约需要20秒,但仍在1秒钟内运行。我只是想确保我所做的更改带

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

DBCC FREEPROCCACHE


但这两种方法似乎都不管用。每个查询在第一次执行时大约需要20秒,但仍在1秒钟内运行。我只是想确保我所做的更改带来了改进,而不是缓存带来的改进。是否还有其他技巧可以做到这一点?

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


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

您应该尝试dbcc dropcleanbuffers (MSDN:


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

今天在巴塞尔techday活动上,一位sql专业人士使用了上述两个建议的组合:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

因此,我认为它应该可以工作:-)

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

CHECKPOINT
DBCC DROPCLEANBUFFERS

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