【问题标题】:Functions in SQL Server 2008SQL Server 2008 中的函数
【发布时间】:2009-10-13 17:36:36
【问题描述】:

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

【问题讨论】:

标签: sql sql-server tsql sql-server-2008 sql-execution-plan


【解决方案1】:

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

但是...无论如何,一个简单的表值函数都未嵌套/扩展到外部查询中。就像一个视图。 And my answer (with links) here

也就是这种类型:

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

【讨论】:

    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2012-01-02
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      相关资源
      最近更新 更多