gpt4 book ai didi

sql - 优化在join条件下使用多个用户定义的函数

转载 作者:行者123 更新时间:2023-12-03 16:56:46 25 4
gpt4 key购买 nike

在 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 (即,两者都是 INLINE 函数)。

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

最佳答案

I cannot find a way to rework this into a form making use of table value functions.



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

于是改写如下:
SELECT ...
FROM A
CROSS JOIN B
CROSS APPLY dbo.MyPredicate(A.x, B.y) p
WHERE p.SomeValue = 1
CROSS JOIN是二次比较。连接后,您可以使用两个表中的值来执行连接条件。

关于sql - 优化在join条件下使用多个用户定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54550805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com