标量 UDF 强制执行整体串行计划,这是相当有据可查的。
鉴于大量行进入管道中必须计算 UDF 的点,为什么引擎不能在处理器之间分配它们?如果 UDF 中没有状态,则顺序无关紧要。
有人声称 UDF 是一个必须使用光标的黑盒。我可以看到,对于在迭代之间保持某些状态但似乎应该是可并行化的情况,用户光标无法在 SP 内并行化。
额外的点来解释为什么引擎强制整个计划是串行的,而不仅仅是 UDF 计算阶段。
对并行 UDF 的支持是否是一个合理的请求功能?
标量 UDF 强制执行整体串行计划,这是相当有据可查的。
鉴于大量行进入管道中必须计算 UDF 的点,为什么引擎不能在处理器之间分配它们?如果 UDF 中没有状态,则顺序无关紧要。
有人声称 UDF 是一个必须使用光标的黑盒。我可以看到,对于在迭代之间保持某些状态但似乎应该是可并行化的情况,用户光标无法在 SP 内并行化。
额外的点来解释为什么引擎强制整个计划是串行的,而不仅仅是 UDF 计算阶段。
对并行 UDF 的支持是否是一个合理的请求功能?
我不确定它是否有据可查。
请参阅强制执行并行执行计划和/或 Craig Freedman 的并行执行演示文稿。
这些说法是不正确的。
我的理解是,当前的限制纯粹是某些实施细节的结果。没有根本原因无法使用并行性执行函数。
具体来说,T-SQL 标量函数在单独的 T-SQL 上下文中执行,这使正确操作、协调和关闭(尤其是在发生错误的情况下)变得非常复杂。
同样,表变量通常支持并行读取(但不支持写入),但表值函数公开的表变量由于特定于实现的原因不能支持并行读取。恐怕你需要有源代码访问权限(以及分享细节的自由)的人来提供权威的答案。
当然,如果你能做一个足够强大的案例。我自己的感觉是,所涉及的工作会很广泛,所以你的提案必须达到一个非常高的标准。例如,提供内联标量函数的相关(并且更简单)的请求得到了很好的支持,但多年来一直没有实现。
您可能想阅读 Microsoft 论文:
...它概述了 Microsoft 希望在 SQL Server 2017 之后的版本中解决 T-SQL 标量函数性能问题的方法。
(强调我的)
内联标量 T-SQL 函数现在在 SQL Server 2019 中实现。
正如保罗在他的回答中正确提到的那样,没有根本原因不能使用并行执行标量 UDF。然而,除了实现方面的挑战之外,还有另一个原因迫使它们串行化。Paul 引用的Froid论文提供了更多相关信息。
引用论文(第 2.3 节):
如论文所述,Froid 的方法不仅会产生并行计划,还会为使用 UDF 的查询增加更多好处。本质上,它包含了您对 UDF 并行执行的请求。
[披露:我是 Froid 论文的合著者]