8

我有一些查询在我们的实时环境中导致超时。 (> 30秒)如何解决只在缓存前运行缓慢的查询

如果我运行profiler并抓取正在运行的SQL并从Management Studio运行,那么他们需要很长时间才能运行第一次,然后在每次运行后降至几百毫秒。

这显然是SQL缓存数据并将其全部存入内存。

我确信可以对SQL进行优化,使其运行速度更快。

我的问题是,我怎么能“修复”这些查询时,我第二次运行它的数据已被缓存,并且速度很快?

回答

8

http://morten.lyhr.dk/2007/10/how-to-clear-sql-server-query-cache.html,您可以运行以下清除缓存:

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

编辑:我与SQL Server文档我有检查,这至少是真实的SQL Server 2000

+0

优秀!正是我在找什么。运行查询时,我现在得到完全一致的结果! – 2009-01-29 12:48:18

+1

这不就是让它每次都运行缓慢吗? – DevinB 2009-01-29 14:31:07

+1

您不必每次都缓慢地运行查询以优化查询。无论结果是否被缓存,查询计划都会保持一致(请参阅我的回答) – 2009-01-31 09:09:48

2

查询优化是一个很大的主题,对于你的问题没有单一的答案。无论结果是否被缓存,关于做什么的线索都在查询计划中应该是相同的。

查找常用的东西,如表扫描,当你希望他们使用不使用索引,等等,等等最终你可能不得不revew数据模型,也许实施denormalisation战略。

0

来自MSDN:
“使用DBCC DROPCLEANBUFFERS在不关闭并重新启动服务器的情况下使用冷缓冲区高速缓存测试查询。”

4

使用可以使用

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

但只能用这个在你的开发环境,同时调整部署查询到实时的服务器。

8

我可以建议您检查执行计划的负责你的糟糕的性能问题的查询。

您需要在执行计划中确定哪些步骤具有最高的成本和原因。例如,可能是您的查询正在执行表扫描,或者正在使用不适当的索引。

RedGate网站提供了一个非常详细的免费电子书,专门用于了解执行计划的内容。

https://www.red-gate.com/Dynamic/Downloads/DownloadForm.aspx?download=ebook1

您可能会发现,还有就是你想用于查询特定的执行计划。您可以使用查询提示强制SQL Server中的查询使用哪个执行计划。这是一个非常先进的概念,应该谨慎使用。有关更多详细信息,请参阅以下Microsoft白皮书。

http://www.microsoft.com/technet/prodtechnol/sql/2005/frcqupln.mspx

我也不会建议你清除生产环境过程缓存,因为这将不利于所有其他查询平台上目前尚未遇到性能问题的表现。

例如,如果您正在执行存储过程,则可以通过使用WITH RECOMPILE命令确保为每次执行过程计算新的执行计划。

对于整体性能调优信息,Brent Ozar博客上有一些优秀的资源。

http://www.brentozar.com/sql-server-performance-tuning/

希望这会有所帮助。干杯。

3

我认为人们往往走错了方向。如果我明白了,你希望表演始终保持良好状态?他们在第二次(以及后续的执行)中跑得不快,而且第一次很慢?

上面的DBCC命令清除缓存,导致WORSE性能。

你想要什么,我认为,首要的是泵和缓存数据。您可以使用一些执行查询并将数据加载到内存的启动过程来执行此操作。内存是一种有限的资源,因此您无法将所有数据加载到内存中,但可以找到平衡点。布伦特上​​面有一些很好的参考资料可以帮助你了解你在这里可以做什么。