优化器如何处理标量 UDF 和相关子查询

How are Scalar UDFs and Co-related Subqueries processed by the Optimizer

我有以下疑问。其中一个在 select 语句中使用标量 UDF,另一个在 select 语句中使用一个共同相关的子查询。

Select col1, col2, (select col3 from table2 t2 where t1.col1=t2.col1)
  From table1 t1

Select col1, col2, dbo.getCol3Value(col1)
  From table1 

Create Function dbo.getCol3Value(@col1 as int)
returns int
As
declare @retCol1 int

select @returnCol1 = col3
  from table2
 Where col1= @col1

return @retCol1

我在网上阅读有关不建议使用标量 UDF 的内容,因为它们会导致很多性能问题。 SQL 服务器优化器如何在后台处理我上面列出的查询?编写此类查询的更好方法是什么?

编辑: 我应该说清楚一些事情。子查询或函数始终只会 return 一个值。另外,我需要从 table2 中获取 table1 中每一行的值。

虽然未内联的 T-SQL 标量 UDF 在历史上一直是性能问题的来源,但工程团队最近开展的工作是内联一些 UDF,使这对您来说不是问题.以下是解释支持案例的文档:SQL Documentation on UDF Inlining

这篇学术论文包含更多创新细节,如果您感兴趣:FROID VLDB Paper