这个问题让我发疯了几天,我可能已经找到了答案,但我需要确认并检查最终的简单解决方案。
当存储过程使用一些用户定义的函数时,UDF 计划是否合并到主计划中并且一切都得到优化,还是每次都直接调用?
假设它没有发生,有没有办法强制 SQL Server 为特定的 SP 做这件事?
这个问题让我发疯了几天,我可能已经找到了答案,但我需要确认并检查最终的简单解决方案。
当存储过程使用一些用户定义的函数时,UDF 计划是否合并到主计划中并且一切都得到优化,还是每次都直接调用?
假设它没有发生,有没有办法强制 SQL Server 为特定的 SP 做这件事?
如果我正确理解了这个问题,它应该取决于函数的类型。内联表值函数将其定义替换为引用查询,就像视图发生的情况一样。这就是“内联”的含义,以及为什么它们不是可以签名的真正模块,以及与其他函数类型的其他差异。
多语句表值函数和标量用户定义函数是完全独立的模块,分别执行并有自己的计划。
此行为应该与它们在存储过程或临时查询中被引用无关。
现在,是否每次都调用 UDF,取决于 UDF 的类型:
IsDeterministic=true;
(false
默认情况下),并且不进行任何数据访问,则不会阻止并行计划并且应该能够缓存它们的返回值(我假设是每次查询执行)。所有这些就是为什么最好尽可能将 T-SQL UDF 转换为 T-SQL 内联 TVF。