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

标签 sql-server function tsql sql-execution-plan sql-function

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

有这方面的在线资源吗?

最佳答案

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

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

  • 多语句 TVF:

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

  • 内联 TVF (iTVF):

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

  • 标量 UDF:

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

  • SQLCLR 对象:

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

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

关于sql-server - SQL Server 中是否缓存了函数的执行计划?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3090850/

相关文章:

function - G++ __FUNCTION__ 在带有类名的方法上?

sql-server - 在查询结果上添加假行

mysql - 从数据库中删除表如何影响 View

sql-server - SQL Server 2005 - 在不同的服务器上恢复加密的数据库

c# - 使用单个查询仅选择不匹配项(仅限连接)

function - 从 Racket 中的函数过早返回

java - 在 Java 中使用 lambda 作为类的方法

sql - 如果您不在事务中,SET XACT_ABORT ON 是否会在存储过程中执行任何操作?

sql - 如何在 WHERE 子句中引用别名?

sql - 将总计行添加到 SQL 查询的底部