2014-10-06 105 views
0

我有一個名爲STOREDPROC的存儲過程,它調用一個表值函數TABLEFUNCTION如何刪除SQL Server中特定函數的緩存?

我知道我可以通過使用WITH RECOMPILE選項執行它來刪除存儲過程的緩存。這是否也會刪除過程中調用的函數的緩存?如果沒有,那麼是否有辦法刪除SQL Server中給定函數的緩存?

+0

使用DBCC DROPCLEANBUFFERS在不關閉和重新啓動服務器的情況下使用冷緩衝區高速緩存測試查詢。 DBCC DROPCLEANBUFFERS用於清空數據緩存。 – 2014-10-06 10:15:30

+0

@DhruvinSukhadiya我讀過'DBCC DROPCLEANBUFFERS',發現即使它清除了緩衝池,它主要用於性能測試,這不是我的目標。 有沒有更好的方法? – chaudharyp 2014-10-06 10:25:24

+0

@DhruvinSukhadiya另外,這個命令的問題是我沒有運行這個命令的權限。我認爲這個命令只能由數據庫管理員運行,而我不是。 – chaudharyp 2014-10-06 10:41:49

回答

0

詳細下面的文章描述瞭如何獲得緩存計劃的功能:

http://sqlperformance.com/2013/08/t-sql-queries/parameter-sniffing-embedding-and-the-recompile-options

有了這些信息,應該是比較容易讓你決定是否使用WITH RECOMPILE選項能夠清除任何嵌入式功能的緩存。您還應該檢查使用Option(Recompile)

您也應該檢查文章http://support2.microsoft.com/kb/2801413/en-us

BTW,清除整個計劃緩存,則需要執行該命令DBCC FREEPROCCACHE。

+0

我無法在子查詢中添加「OPTION(RECOMPILE)」提示。它給出了不正確的語法錯誤。由於我從存儲過程調用的函數是內聯函數,我將在存儲過程中使用'WITH RECOMPILE'提示。雖然,我希望使用'OPTION(RECOMPILE)'提示,因爲我不想重新編譯存儲過程中的所有查詢。我只是想重新編譯函數內部的查詢。但是,很遺憾,SQL服務器不允許在該函數中的相關查詢之後放置'OPTION(RECOMPILE)'提示。 – chaudharyp 2014-10-07 04:31:33

+0

您不能只重新編譯子查詢或內聯函數。兩者都是整個查詢的組成部分;編譯器將其視爲一個單元。至於選項(RECOMPILE);它不僅僅是不重新編譯存儲過程的所有查詢;這也是因爲它通常會提供比WITH(RECOMPILE)選項更好的查詢計劃。實際上,即使你想重新編譯一個SP中的所有查詢,每一個使用OPTION(RECOMPILE)都會給你一個比WITH(RECOMPILE)選項更好的性能。如果你沒有考慮編譯所需的時間。 – SylvainL 2014-10-07 04:45:07

+0

但是,因爲重新編譯查詢或SP的過程需要時間;使用這些選項中的任何一個都不一定是您的最佳選擇。編譯的真正問題通常是使用SQL-Server的「參數嗅探」過程,而不是每次重新編譯時,都可以使用其他選項。 在我的答案中的參考給你所有關於這些其他選項的細節。 – SylvainL 2014-10-07 04:48:44