【问题标题】:How is CROSS APPLY or OUTER APPLY different from a Scalar UDF called within SELECT statement (performance wise)? [duplicate]CROSS APPLY 或 OUTER APPLY 与在 SELECT 语句中调用的标量 UDF 有何不同(性能方面)? [复制]
【发布时间】:2018-02-04 21:32:13
【问题描述】:
我已经读到,当 SELECT 语句将要返回多于几行时,最好不要在该 SELECT 语句中使用标量函数。相反,最好创建一个表值 UDF 并将其与 APPLY 运算符一起使用。
谁能举例说明一下?
我使用的是 MS SQL Server 2014。
【问题讨论】:
标签:
sql
sql-server
database
【解决方案1】:
首先,这不是标量函数与表值函数的问题。这是“内联”与“多语句”的问题......因此,简单地将标量值函数转换为表值函数很可能弊大于利,除非您确保生成的表值函数是一个内联表价值函数 (iTVF)。
重要的原因...标量和多语句函数对于优化器来说就像“黑匣子”,因此优化器只是对函数进行一些一般性假设,并盲目地将函数代码应用于外部查询的每一行,通常为函数分配 0 成本。这往往会导致次优的执行计划。
另一方面,内联表值函数对优化器来说是“可行的”。这允许它将函数代码包含到外部查询的执行计划中,就好像它是直接写在外部查询中一样。
现在是真正的脑筋急转弯...由于优化器能够考虑内联函数的开销,因此生成的执行计划将比非内联版本具有更高的估计成本。本质上是在诱使您相信非内联版本更好……事实上,情况恰恰相反。更昂贵的内联版本实际上更好,因为它实际上代表了查询的真实成本。