sql - 优化连接条件下多个用户定义函数的使用
问题描述
在 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
(即,两者都是内联函数)。
我无法找到一种方法将其改造成使用表值函数的形式。我假设必须有一种方法来改进这个查询,但不确定是否有,或者如何开始。
解决方案
我无法找到一种方法将其改造成使用表值函数的形式。
这个有可能。请注意,此逻辑需要对 A 中的所有行与 B 中的所有行进行二次比较。这必然相当慢。
所以改写如下:
SELECT ...
FROM A
CROSS JOIN B
CROSS APPLY dbo.MyPredicate(A.x, B.y) p
WHERE p.SomeValue = 1
是CROSS JOIN
二次比较。连接后,您可以使用两个表中的值来执行连接条件。
推荐阅读
- python - 根据第三列的值,用另一列的值填充数据框列
- rust - 在 Rust 中泛化迭代方法
- azure - Apple 和 LinkedIn 社交登录问题
- javascript - 如果特定的 className 处于活动状态,则在 x 秒内响应更改 className
- oauth-2.0 - MS Exchange:如何启用 SMTP 以使用 OAUTH2.0 但禁用基本身份验证
- mysql - 将 SQL 转换为 sequelize
- windows - 如何在需要 vcruntime DLL 的情况下构建 C++ Windows 可执行文件?
- c - 一步从命令行运行c程序?
- python - 如何优化 Python 简单加密?
- python - ValueError:时间数据“2019 年 3 月 13 日上午 11:02”与格式“MMM d, YYYY h:mm a”不匹配