有没有办法防止SQL缓存的重复调用和更快?

时间:2013-11-05 17:48:17

标签: sql sql-server

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

DBCC FREEPROCCACHE

OPTION(recompile)

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

4 个答案:

答案 0 :(得分:2)

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

CHECKPOINT
DBCC DROPCLEANBUFFERS

答案 1 :(得分:1)

今天在巴塞尔的techday活动中,SQL专业人员确实使用了上述两个建议的组合:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

所以我认为它应该有效: - )

答案 2 :(得分:0)

后续运行更快的原因是因为缓存了执行计划。您对代码的更改要么不足以导致需要重新编译,它们实际上正在运行。尝试使用客户端统计信息测试每次运行。 Management Studio中“执行”图标旁边的按钮可以打开/关闭。

编辑:打开客户统计信息的更明确指示:在顶部菜单中,点击查询>包括客户统计信息。

答案 3 :(得分:0)

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

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