SQL 连接中 OR NULL 的替代方案

问题描述 投票:0回答:1

this Question 可以清楚地看出,

OR
SQL 中的连接条件可能效率低下,因为它们需要嵌套循环,并且无法作为哈希或合并连接进行优化。推荐的解决方案是替换为
UNION
语句。

我尝试优化的查询当前包含一系列

OR
形式的条件:
a.col = b.col OR a.col IS NULL
。对于一百万行,我们估计以小时为单位的运行时间。

但是,由于可能有十几个这样的条件,因此将其转换为等效的

UNION
语句可能会很麻烦 - 每个
OR
条件都会使必须进行
UNION
的子查询数量加倍。所以我渴望找到更好的替代方案。

我目前正在使用的示例:

SELECT  *
FROM #table_a AS a
LEFT JOIN #table_b AS b
ON  (a.col1 = b.col1 OR a.col1 IS NULL)
AND  (a.col2 = b.col2 OR a.col2 IS NULL)
AND  (a.col3 = b.col3 OR a.col3 IS NULL)

我考虑过在连接中使用

COALESCE
,如下所示。这会从条件中删除
OR
,但我预计需要计算
COALESCE
的值也会阻止优化连接。

SELECT  *
FROM #table_a AS a
LEFT JOIN #table_b AS b
ON  COALESCE(a.col1, b.col1, -1) = COALESCE(b.col1, -1)
AND  COALESCE(a.col2, b.col2, -1) = COALESCE(b.col2, -1)
AND  COALESCE(a.col3, b.col3, -1) = COALESCE(b.col3, -1)

如何优化这种连接模式?

sql sql-server sql-server-2019
1个回答
0
投票

您可以在连接之前过滤具有 NULL 值的行

SELECT *
FROM #table_a AS a
LEFT JOIN #table_b AS b
ON a.col1 = b.col1 AND a.col2 = b.col2 AND a.col3 = b.col3
WHERE a.col1 IS NOT NULL AND a.col2 IS NOT NULL AND a.col3 IS NOT NULL;

通过过滤掉 col1、col2 和 col3 为 NULL 的行,可以减少连接操作中需要处理的行数。

还要确保 #table_a 和 #table_b 中的 col1、col2 和 col3 有索引

© www.soinside.com 2019 - 2024. All rights reserved.