是否在SQL Server中缓存了函数的执行计划?

时间:2010-06-22 06:45:29

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

任何正文都可以帮助我理解SQL服务器中缓存的函数的执行计划吗?

任何在线资源?

3 个答案:

答案 0 :(得分:8)

是的,他们确实进入了执行计划缓存。

sys.dm_exec_query_plan DMV将显示给定计划句柄的计划。从那里引用:

  

各种类型的查询计划   Transact-SQL批处理,例如ad hoc   批处理,存储过程和   用户定义的函数,缓存在   一个称为计划的记忆区域   缓存。每个缓存的查询计划都是   由唯一标识符标识   称为计划句柄。你可以指定   这个计划处理了   sys.dm_exec_query_plan动态   管理视图来检索   特定的执行计划   Transact-SQL查询或批处理。

答案 1 :(得分:8)

接受的答案是不准确/误导的,主要是由于引用的引用对于术语“用户定义的函数”而言过于模糊。

Microsoft SQL Server中有几种不同类型的用户定义函数,它们的处理方式不同:

  • 多语句TVF:

    这些被视为存储过程。执行它们的查询仅显示对其名称的引用,而不显示其任何定义。它们显示在sys.dm_exec_cached_plans中,其中cacheobjtype为“已编制计划”,objtype为“Proc”。任何输入参数值也与计划一起存储,因此多语句TVF受到参数嗅探问题的影响。

  • 内联TVF(iTVF):

    这些被视为视图。执行它们的查询包含它们的定义。它们显示在sys.dm_exec_cached_plans中,其中cacheobjtype为“Parse Tree”,objtype为“View”。输入参数值与计划一起存储,因此内联TVF 受参数嗅探问题的影响。

  • 标量UDF:

    这些被视为存储过程。执行它们的查询仅显示对其名称的引用,而不显示其任何定义。它们显示在sys.dm_exec_cached_plans中,其中cacheobjtype为“已编制计划”,objtype为“Proc”。任何输入参数值也与计划一起存储,因此标量UDF受参数嗅探问题的影响。此外,与上面提到的两种类型的TVF不同,但与常规存储过程类似,您可以在通过WITH RECOMPILE而不是EXEC[UTE]执行时使用SELECT选项强制重新编译执行计划。 {1}}。

  • SQLCLR对象:

    这些更像是客户端/应用程序代码。执行它们的查询仅显示对其名称的引用,而不显示其任何定义。它们显示在SET中,sys.dm_exec_cached_plans为“CLR Compiled Func”或“CLR Compiled Proc”,cacheobjtype为“Proc”。但是,与多语句TVF和标量UDF不同,它们没有定义,因此没有关联的查询计划。但是,他们执行的任何特殊查询(而非存储过程调用)都会显示在objtype中,其中sys.dm_exec_cached_plans为“已编译计划”,cacheobjtype为“已准备好”。任何这些特殊查询,如果参数化,应该使用准备好的计划存储初始输入参数值,因此会受到参数嗅探问题的影响。

有关对象缓存的更多详细信息,请参阅Caching Mechanisms上的MSDN页面。

答案 2 :(得分:2)

是的,他们被认为是缓存。

http://msdn.microsoft.com/en-us/library/ms181055.aspx