sql server 是否缓存函数的执行计划?
问问题
1178 次
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 回答