2009-12-06 83 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將如何處理數據?更何況同步問題等