7

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

有这方面的在线资源吗?

4

3 回答 3

10

接受的答案不准确/具有误导性,主要是因为引用的引用对术语“用户定义的函数”过于含糊。

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

  • 多语句 TVF:

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

  • 内联 TVF (iTVF):

    这些被视为视图。执行它们的查询包含它们的定义。它们出现在sys.dm_exec_cached_planscacheobjtype解析树”和objtype“视图”中。输入参数值与计划一起存储,因此内联 TVF不受参数嗅探问题的影响。

  • 标量 UDF:

    这些被视为存储过程。执行它们的查询只显示对它们名称的引用,而不是对它们的任何定义的引用。他们出现在sys.dm_exec_cached_planscacheobjtypeCompiled Plan”和objtype“Proc”中。任何输入参数值也与计划一起存储,因此标量 UDF 会受到参数嗅探问题的影响。此外,与上述两种类型的 TVF 不同,但与常规存储过程一样,您可以在执行WITH RECOMPILE时使用选项强制重新编译执行计划 viaEXEC[UTE]而不是SELECTor SET

  • SQLCLR 对象:

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

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

于 2015-11-29T17:33:19.560 回答
8

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

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

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

于 2010-06-22T07:12:42.803 回答
2

是的,它们被考虑用于缓存。

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

于 2010-06-22T06:57:03.987 回答