优化器如何处理标量 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
我有以下疑问。其中一个在 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