如何清除查询缓存以调试第一次运行缓慢的查询?

时间:2014-10-21 21:29:27

标签: sql sql-server performance sql-server-2012

我的查询在第一次执行时运行缓慢。我想尝试调整它,但我无法重现问题。

我尝试使用 DBCC FREEPROCCACHE 来查看我是否可以让查询再次运行缓慢,但它没有任何效果。我需要清除另一个缓存,以便再次查看不良行为吗?可能是其他导致我的查询第一次运行缓慢的原因吗?

2 个答案:

答案 0 :(得分:1)

使用系统存储过程sp_recompile

Exec sp_recompile 'Table_Name'
GO

这将导致使用特定表的所有查询/存储过程/函数在执行时重新编译执行计划。

或者,如果您只希望特定的存储过程或函数刷新所有已编译的执行计划,则可以将该对象的名称用作sp_recompile的参数

Exec sp_recompile 'proc_Name'
GO

有时候使用DBCC FREEPROCCACHE不是一个选项,因为它会刷新所有的proc缓存,你当然不希望在生产服务器甚至许多开发人员正在工作的开发服务器上这样做。

答案 1 :(得分:0)

  

我尝试使用DBCC FREEPROCCACHE来查看是否可以运行查询   又慢了,但没有效果。我需要另一个缓存吗?   明确再次看到不良行为?可能是别的东西   导致我的查询第一次运行缓慢?

可能是数据缓冲区缓存是问题所在。必须在第一次运行查询时为磁盘读取尚未在内存中的数据页,但不会在后续执行时读取,因为数据在内存中。磁盘评估显然会大大减慢查询速度。您可以执行DROPCLEANBUFFERS(最好在测试服务器上)从内存中删除页面,这样页面必须在下次访问时从磁盘读取,并且可能重复初始的缓慢。

USE MyDatabase;
CHECKPOINT;
DBCC DROPCLEANBUFFERS;

从性能角度来看,确保您已完成查询索引调整,以便仅触及查询实际需要的数据。除了存储子系统调整,获得更快的磁盘或SSD之外,在需要磁盘访问时,您还无法提高性能。