任何正文都可以帮助我理解SQL服务器中缓存的函数的执行计划吗?
任何在线资源?
答案 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)