我已经读过当SELECT语句要返回多行时,最好不要在SELECT语句中使用标量函数。相反,最好创建一个表值UDF并将其与APPLY运算符一起使用。
有人可以用例子来解释吗?
我正在使用MS SQL Server 2014.
答案 0 :(得分:1)
首先,它不是标量函数与表值函数的关系。这是"内联" vs" muliti-statement" ...所以简单地将标量值函数转换为表值函数最有可能弊大于利,除非你确保得到的表值函数是一个INLINE TABLE VALUED FUNCTION (iTVF)。
重要的原因...... Scalar&多语句功能类似于"黑盒子"对于优化器,优化器只是对函数进行一些一般性假设,并盲目地将函数代码应用于外部查询的每一行,通常为函数分配0成本。这往往会导致次优的执行计划。
另一方面,内联表值函数是可行的"到优化器。这允许它将函数代码包含在外部查询的执行计划中,就像它直接写在外部查询中一样。
现在对于真正的大脑弯曲...因为优化器能够考虑内联函数的费用,所以得到的执行计划将具有比非内联版本更高的估计成本。基本上欺骗你相信非内联版本更好......事实上,情况正好相反。更昂贵的内联版本实际上更好,因为它实际上代表了查询的真实成本。