2009-12-06 46 views
16

只是一个一般性的问题:如何让SQL Server知道不在查询中使用缓存?

是否有一个查询/命令我可以传递到SQL Server不执行特别查询时使用缓存?

我正在查找可以设置的查询/命令,而不是配置设置。有没有必要这样做?

+0

我想不出你会想这样做的原因,我从来没有见过它做过。你想解决什么问题? – jvilalta 2009-12-06 23:17:23

+5

对于在无法使用高速缓存时测量执行查询所花费的平均时间可能很有用。 – 2009-12-06 23:18:55

+8

@Jvilata - >当你想修正存储过程或查询的原始性能时,你会这样做。查询/ sp运行的最慢时间是当它第一次编译时,因为它没有被缓存......并且这不包括查询假设/返回的内容。因此,如果你可以修复查询/ sp未被缓存时的性能,那么你就知道该查询的最坏情况(或多或少)。 – 2009-12-06 23:26:58

回答

19
DBCC FREEPROCCACHE 

将删除所有缓存程序的执行计划。这会导致所有后续的过程调用被重新编译。

将“WITH RECOMPILE”添加到过程定义中会导致程序在每次调用时都会重新编译。

我不认为(在SQL 2005或更早版本中)有任何方法可以清除单个程序执行计划的程序缓存,并且我也怀疑你在2008年也可以这样做。

+2

您可以使用以下SQL删除单个计划。 DBCC FREEPROCCACHE [({plan_handle | sql_handle | pool_name})] [WITH NO_INFOMSGS] – Afr 2013-04-21 22:18:42

1

使用

WITH RECOMPILE 
16

如果要强制查询不使用数据缓存,最好的办法是在运行查询之前清除缓存:

CHECKPOINT 
DBCC DROPCLEANBUFFERS 

注意,迫使重新编译将对无影响查询使用数据缓存。

您不能只标记单个查询以避免缓存的一个原因是缓存使用是执行查询不可或缺的一部分。如果数据已经在缓存中,那么如果第二次读取数据,SQL Server将如何处理数据?更何况同步问题等