【发布时间】:2009-10-13 17:36:36
【问题描述】:
sql server 是否缓存函数的执行计划?
【问题讨论】:
标签: sql sql-server tsql sql-server-2008 sql-execution-plan
sql server 是否缓存函数的执行计划?
【问题讨论】:
标签: sql sql-server tsql sql-server-2008 sql-execution-plan
是的,请参阅 rexem 的 Tibor 链接和 Andrew 的回答。
但是...无论如何,一个简单的表值函数都未嵌套/扩展到外部查询中。就像一个视图。 And my answer (with links) here
也就是这种类型:
CREATE FUNC dbo.Foo ()
RETURNS TABLE
AS
RETURN (SELECT ...)
GO
【讨论】:
根据 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。
【讨论】: