【问题标题】: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 成本。这往往会导致次优的执行计划。

另一方面,内联表值函数对优化器来说是“可行的”。这允许它将函数代码包含到外部查询的执行计划中,就好像它是直接写在外部查询中一样。

现在是真正的脑筋急转弯...由于优化器能够考虑内联函数的开销,因此生成的执行计划将比非内联版本具有更高的估计成本。本质上是在诱使您相信非内联版本更好……事实上,情况恰恰相反。更昂贵的内联版本实际上更好,因为它实际上代表了查询的真实成本。

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多