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

Ash*_*i K 7 t-sql sql-server function sql-function sql-execution-plan

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

任何在线资源?

Ada*_*Dev 8

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

sys.dm_exec_query_plan两个 DMV会显示给定的计划句柄的计划.从那里引用:

各种类型的Transact-SQL批处理(例如临时批处理,存储过程和用户​​定义的函数)的查询计划缓存在称为计划缓存的内存区域中.每个缓存的查询计划都由称为计划句柄的唯一标识符标识.您可以使用sys.dm_exec_query_plan动态管理视图指定此计划句柄,以检索特定Transact-SQL查询或批处理的执行计划.


Sol*_*zky 8

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

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_planscacheobjtype"编译计划"中和objtype的"准备".任何这些特殊查询,如果参数化,应该使用准备好的计划存储初始输入参数值,因此会受到参数嗅探问题的影响.

有关对象缓存的更多详细信息,请参阅缓存机制的MSDN页面.