回答
是的,他們的確去執行計劃緩存。
sys.dm_exec_query_plan DMV將顯示給定計劃句柄的計劃。從那裏報價:
查詢計劃的各類 的Transact-SQL批處理,如特設 批次,存儲過程和 用戶定義的函數,在 緩存的內存區域稱爲計劃 緩存。每個高速緩存的查詢計劃是由稱爲計劃句柄的唯一標識符 標識的 。您可以指定 此計劃句柄以及 sys.dm_exec_query_plan動態 管理視圖以檢索特定的 Transact-SQL查詢或批處理的執行計劃 。
接受的答案不準確/誤導,主要是由於引用的引用對於術語「用戶定義的函數」過於模糊。
有幾種不同類型的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]
而不是SELECT
或SET
執行時使用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頁面。
- 1. SQL執行計劃緩存
- 2. SQL Server執行計劃顯示什麼?
- 3. SQL Server中執行計劃的用法是什麼?
- 4. 用於填充計劃緩存的即席查詢的SQL Server執行計劃
- 5. 什麼時候執行計劃在SQL Server中生成?
- 6. SQL SERVER - 執行計劃
- 7. SQL Server版升級和緩存執行計劃
- 8. SQL Server的執行計劃和行
- 9. Sql Server是否緩存跨事務的編譯查詢和執行計劃?
- 10. 這裏執行計劃是什麼?
- 11. 執行計劃,SQL Server 2012的
- 12. SQL Server的執行計劃問題
- 13. SQL Server:預計執行計劃
- 14. SQL Server 2005緩存了一個永遠無法運行的執行計劃
- 15. 並行SQL Server執行計劃
- 16. 緩存計劃大小在計劃緩存和執行計劃中的不同值
- 17. SQL Server標量函數與子查詢執行計劃分析
- 18. PostgreSQL中函數的執行計劃
- 19. SQL Server捕獲執行計劃
- 20. 重置SQL Server執行計劃
- 21. SQL Server查詢執行計劃重建
- 22. SQL Server丟失執行計劃
- 23. SQL Server執行計劃問題
- 24. SQL Server sp_ExecuteSQL和執行計劃
- 25. SQL Server選擇錯誤執行計劃
- 26. 從SQL Server執行計劃分析keylookup
- 27. SQL數據執行計劃
- 28. SQL Server查詢計劃緩存和計劃重用的存儲過程
- 29. SQL執行計劃
- 30. 如何在Linux的MS Sql Server中查看執行計劃
謝謝,但在鏈接中沒有寫入用戶定義的函數也被考慮用於計劃緩存? – 2010-06-22 07:01:58
這是從文章中摘錄的內容: '在SQL Server中執行任何SQL語句時,關係引擎首先查看過程高速緩存以驗證是否存在同一SQL語句的現有執行計劃。 SQL Server重用它找到的任何現有計劃,節省重新編譯SQL語句的開銷。如果不存在現有的執行計劃,則SQL Server將爲該查詢生成一個新的執行計劃 – codingbadger 2010-06-22 07:11:50