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