首页 > 解决方案 > 优化连接条件下多个用户定义函数的使用

问题描述

在 SQL Server 2016 (v13) 中工作。

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

(简化的)查询大致如下:

   select *
     from tblA A
left join tblB B 
       on 1 = dbo.udf1(A.field1, B.anotherField1)
      and 1 = dbo.udf2(A.field2, B.anotherField2)

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

CREATE FUNCTION dbo.udf1 (@p1 VARCHAR(100), @p2 VARCHAR(100))
  RETURNS bit
AS
BEGIN
    DECLARE @result BIT;
    SELECT @result = IIF(@p1 LIKE @p2, 1, 0);
    RETURN(@result)
END

UDF 自然要复杂一些,但都写成一个单一的SELECT(即,两者都是内联函数)。

我无法找到一种方法将其改造成使用表值函数的形式。我假设必须有一种方法来改进这个查询,但不确定是否有,或者如何开始。

标签: sqlsql-servertsqloptimization

解决方案


我无法找到一种方法将其改造成使用表值函数的形式。

这个有可能。请注意,此逻辑需要对 A 中的所有行与 B 中的所有行进行二次比较。这必然相当慢。

所以改写如下:

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

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


推荐阅读