0

sql server 是否缓存函数的执行计划?

4

2 回答 2

2

是的,请参阅 rexem 的 Tibor 链接和 Andrew 的回答。

但是...无论如何,一个简单的表值函数都未嵌套/扩展到外部查询中。就像一个视图。我的回答(带链接)在这里

也就是说,这种类型:

CREATE FUNC dbo.Foo ()
RETURNS TABLE
AS
RETURN (SELECT ...)
GO
于 2009-10-13T18:20:15.433 回答
2

根据 dmv 是的, 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。

于 2009-10-13T17:44:17.963 回答