2010-06-22 46 views

回答

8

是的,他們的確去執行計劃緩存。

sys.dm_exec_query_plan DMV將顯示給定計劃句柄的計劃。從那裏報價:

查詢計劃的各類 的Transact-SQL批處理,如特設 批次,存儲過程和 用戶定義的函數,在 緩存的內存區域稱爲計劃 緩存。每個高速緩存的查詢計劃是由稱爲計劃句柄的唯一標識符 標識的 。您可以指定 此計劃句柄以及 sys.dm_exec_query_plan動態 管理視圖以檢索特定的 Transact-SQL查詢或批處理的執行計劃 。

2

是的,他們被認爲是緩存。

http://msdn.microsoft.com/en-us/library/ms181055.aspx

+0

謝謝,但在鏈接中沒有寫入用戶定義的函數也被考慮用於計劃緩存? – 2010-06-22 07:01:58

+2

這是從文章中摘錄的內容: '在SQL Server中執行任何SQL語句時,關係引擎首先查看過程高速緩存以驗證是否存在同一SQL語句的現有執行計劃。 SQL Server重用它找到的任何現有計劃,節省重新編譯SQL語句的開銷。如果不存在現有的執行計劃,則SQL Server將爲該查詢生成一個新的執行計劃 – codingbadger 2010-06-22 07:11:50

3

接受的答案不準確/誤導,主要是由於引用的引用對於術語「用戶定義的函數」過於模糊。

有幾種不同類型的Microsoft SQL Server用戶定義的函數,他們的處理方式不同:

  • 多語句TVFs:

    這些被當作存儲過程。執行它們的查詢僅顯示對其名稱的引用,而不顯示它們的任何定義。他們在sys.dm_exec_cached_plans中顯示「編譯計劃」的cacheobjtype和「Proc」的objtype。任何輸入參數值也存儲在計劃中,因此多語句TVF受到參數嗅探問題的影響。

  • 內嵌TVFs(iTVFs):

    這些被當作觀。執行它們的查詢合併了它們的定義。它們在sys.dm_exec_cached_plans中顯示爲「解析樹」的cacheobjtype和「視圖」的objtype。輸入參數值是而不是與計劃一起存儲,因此Inline TVF是而不是受制於參數嗅探問題。

  • 標量UDF:

    這些被當作存儲過程。執行它們的查詢僅顯示對其名稱的引用,而不顯示它們的任何定義。他們在sys.dm_exec_cached_plans中顯示「編譯計劃」的cacheobjtype和「Proc」的objtype。任何輸入參數值也與計劃一起存儲,因此標量UDF受到參數嗅探問題的影響。此外,與上述兩種類型的TVF不同,但與常規存儲過程類似,您可以在通過EXEC[UTE]而不是SELECTSET執行時使用WITH RECOMPILE選項強制執行計劃的重新編譯。

  • SQLCLR對象:

    這些被視爲更象的客戶端/應用程序代碼。執行它們的查詢僅顯示對其名稱的引用,而不顯示它們的任何定義。它們在sys.dm_exec_cached_plans中顯示爲具有「CLR編譯功能」或「CLR編譯過程」的cacheobjtype,以及「Proc」的objtype。但是,與多語句TVF和Scalar UDF不同,它們沒有定義,因此沒有關聯的查詢計劃。但是,它們執行的任何即席查詢(不是存儲過程調用)都會在sys.dm_exec_cached_plans中顯示爲「已編譯計劃」的cacheobjtype和「準備好」的objtype。這些即席查詢中的任何一個(如果參數化的話)都應該將初始輸入參數值存儲在準備好的計劃中,並且因此會受到參數嗅探問題的影響。

有關對象緩存的更多詳細信息,請參閱Caching Mechanisms上的MSDN頁面。