CROSS APPLY或OUTER APPLY与SELECT语句中调用的标量UDF有何不同(性能明智)?

时间:2017-08-27 12:34:48

标签: sql sql-server database

我已经读过当SELECT语句要返回多行时,最好不要在SELECT语句中使用标量函数。相反,最好创建一个表值UDF并将其与APPLY运算符一起使用。

有人可以用例子来解释吗?

我正在使用MS SQL Server 2014.

1 个答案:

答案 0 :(得分:1)

首先,它不是标量函数与表值函数的关系。这是"内联" vs" muliti-statement" ...所以简单地将标量值函数转换为表值函数最有可能弊大于利,除非你确保得到的表值函数是一个INLINE TABLE VALUED FUNCTION (iTVF)。

重要的原因...... Scalar&多语句功能类似于"黑盒子"对于优化器,优化器只是对函数进行一些一般性假设,并盲目地将函数代码应用于外部查询的每一行,通常为函数分配0成本。这往往会导致次优的执行计划。

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

现在对于真正的大脑弯曲...因为优化器能够考虑内联函数的费用,所以得到的执行计划将具有比非内联版本更高的估计成本。基本上欺骗你相信非内联版本更好......事实上,情况正好相反。更昂贵的内联版本实际上更好,因为它实际上代表了查询的真实成本。