在联接条件下优化使用多个用户定义的功能

时间:2019-02-06 09:58:56

标签: sql sql-server tsql optimization

在SQL Server 2016(v13)中工作。

我正在两个表(tblA和tblB)之间执行左联接,其中联接条件包括多个用户定义的标量函数(UDF)。 UDF从tblA和tblB中获取参数。我不知道是否或如何优化查询。

(减少的)查询大致如下:

pip

例如,dbo.udf1和dbo.udf2类似于:

conda

UDF自然要复杂一些,但都写为单个 select * from tblA A left join tblB B on 1 = dbo.udf1(A.field1, B.anotherField1) and 1 = dbo.udf2(A.field2, B.anotherField2) (即,都是INLINE函数)。

我找不到使用表值函数将其重新整理成表格的方法。我假设必须有一种方法可以改善此查询,但是不确定是否存在,或者如何开始。

1 个答案:

答案 0 :(得分:1)

  

我找不到一种使用表值函数将其重新整理成表单的方法。

这是可能的。请注意,此逻辑要求对A的所有行与B的所有行进行二次方比较。这一定很慢。

所以重写如下:

SELECT ...
FROM A
CROSS JOIN B
CROSS APPLY dbo.MyPredicate(A.x, B.y) p
WHERE p.SomeValue = 1

CROSS JOIN是二次比较。联接之后,您可以使用两个表中的值来执行联接条件。