Ash*_*i K 7 t-sql sql-server function sql-function sql-execution-plan
任何机构都可以帮助我理解SQL服务器中缓存的函数的执行计划吗?
任何在线资源?
是的,他们确实进入执行计划缓存.
该sys.dm_exec_query_plan两个 DMV会显示给定的计划句柄的计划.从那里引用:
各种类型的Transact-SQL批处理(例如临时批处理,存储过程和用户定义的函数)的查询计划缓存在称为计划缓存的内存区域中.每个缓存的查询计划都由称为计划句柄的唯一标识符标识.您可以使用sys.dm_exec_query_plan动态管理视图指定此计划句柄,以检索特定Transact-SQL查询或批处理的执行计划.
接受的答案是不准确/误导的,主要是由于引用的引用对于术语"用户定义的函数"而言过于模糊.
Microsoft SQL Server中有几种不同类型的用户定义函数,它们的处理方式不同:
多语种TVF:
这些被视为存储过程.执行它们的查询仅显示对其名称的引用,而不显示其任何定义.他们出现在sys.dm_exec_cached_plans同一个cacheobjtype"编译计划"和objtype"过程"的.任何输入参数值也与计划一起存储,因此多语句TVF受到参数嗅探问题的影响.
内联TVF(iTVF):
这些被视为视图.执行它们的查询包含它们的定义.他们出现在sys.dm_exec_cached_plans同一个cacheobjtype"解析树"中和objtype的"查看".输入参数值不存储的计划,因此,内联TVFs都不会受到参数嗅探问题.
标量UDF:
这些被视为存储过程.执行它们的查询仅显示对其名称的引用,而不显示其任何定义.他们出现在sys.dm_exec_cached_plans同一个cacheobjtype"编译计划"和objtype"过程"的.任何输入参数值也与计划一起存储,因此标量UDF受参数嗅探问题的影响.此外,与上面提到的两种类型的TVF不同,但与常规存储过程类似,您可以WITH RECOMPILE在执行via EXEC[UTE]而不是SELECT或使用选项时强制重新编译执行计划SET.
SQLCLR对象:
这些被视为更像客户端/应用程序代码.执行它们的查询仅显示对其名称的引用,而不显示其任何定义.他们出现在sys.dm_exec_cached_plans同一个cacheobjtype"CLR编译功能"或"CLR编译PROC",和一个objtype"过程"的.但是,与多语句TVF和标量UDF不同,它们没有定义,因此没有关联的查询计划.然而,任何即席查询(不存储过程调用),他们执行的出现sys.dm_exec_cached_plans与cacheobjtype"编译计划"中和objtype的"准备".任何这些特殊查询,如果参数化,应该使用准备好的计划存储初始输入参数值,因此会受到参数嗅探问题的影响.
有关对象缓存的更多详细信息,请参阅缓存机制的MSDN页面.