2009-10-13 183 views
0

是否SQL服務器緩存功能的執行計劃?功能在SQL Server 2008

+0

參考:http://sqlblog.com/blogs/tibor_karaszi/archive/2007/06/14/are-execution-plans-for-functions- cached.aspx – 2009-10-13 17:41:33

回答

2

據車管所肯定的,但http://msdn.microsoft.com/en-us/library/ms189747.aspx我不得不運行測試,以確認。在輸出

對象ID是「的對象(例如,存儲過程或用戶定義的函數)該查詢計劃的ID」。

測試它,是的,它看起來像他們得到一個單獨的計劃緩存條目。

測試腳本:

create function foo (@a int) 
    returns int 
as 
begin 
    return @a 
end 

最基本的創建功能。

-- clear out the plan cache 
dbcc freeproccache 
dbcc dropcleanbuffers 
go 

-- use the function 
select dbo.foo(5) 
go 

-- inspect the plan cache 
select * from sys.dm_exec_cached_plans 
go 

計劃緩存於是具有4個條目,所述一個列爲OBJTYPE = PROC是功能計劃緩存,抓住所述手柄和裂縫打開。

select * from sys.dm_exec_query_plan(<insertplanhandlehere>) 

我測試的第一個adhoc是實際查詢,第二個ad-hoc是詢問計劃緩存的查詢。因此,它明確接收到與正在發佈的特別查詢不同的proc類型的單獨條目。計劃句柄也不同,當使用計劃句柄提取時,它將對象id提供回原始函數,而特別查詢不提供對象ID。

2

是的,看到rexem的蒂博爾鏈接和安德魯的回答。

但是......一個簡單的表值函數是嵌套的/擴展到外部查詢反正。像一個看法。 And my answer (with links) here

也就是說,這種類型:

CREATE FUNC dbo.Foo() 
RETURNS TABLE 
AS 
RETURN (SELECT ...) 
GO