任何人都可以帮助我了解 SQL Server 中是否缓存了函数的执行计划吗?
有这方面的在线资源吗?
最佳答案
接受的答案不准确/具有误导性,主要是因为引用的引用对于术语“用户定义函数”过于模糊。
Microsoft SQL Server 中有多种不同类型的用户定义函数,它们的处理方式也不同:
多语句 TVF:
它们被视为存储过程。执行它们的查询仅显示对其名称的引用,而不显示对其任何定义的引用。他们出现在
sys.dm_exec_cached_plans
与cacheobjtype
“编译计划”和objtype
“过程”。任何输入参数值也与计划一起存储,因此多语句 TVF 会受到参数嗅探问题的影响。内联 TVF (iTVF):
这些被视为 View 。执行它们的查询包含它们的定义。他们出现在
sys.dm_exec_cached_plans
与cacheobjtype
“解析树”和objtype
看法”。输入参数值不与计划一起存储,因此内联TVF不会受到参数嗅探问题的影响。标量 UDF:
它们被视为存储过程。执行它们的查询仅显示对其名称的引用,而不显示对其任何定义的引用。他们出现在
sys.dm_exec_cached_plans
与cacheobjtype
“编译计划”和objtype
“过程”。任何输入参数值也与计划一起存储,因此标量 UDF 会受到参数嗅探问题的影响。此外,与上面提到的两种类型的 TVF 不同,但与常规存储过程一样,您可以使用WITH RECOMPILE
强制重新编译执行计划。通过EXEC[UTE]
执行时的选项而不是SELECT
或SET
.SQLCLR 对象:
这些更像是客户端/应用程序代码。执行它们的查询仅显示对其名称的引用,而不显示对其任何定义的引用。他们出现在
sys.dm_exec_cached_plans
与cacheobjtype
“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/