小编典典

两次左联接与联盟的表现

sql

我已经搜索过,但没有找到明确的答案。以下哪一项对SQL Server的性能更好:

SELECT T.*
FROM dbo.Table1 T
    LEFT JOIN Table2 T2 ON T.ID = T2.Table1ID
    LEFT JOIN Table3 T3 ON T.ID = T3.Table1ID
WHERE T2.Table1ID IS NOT NULL
    OR T3.Table1ID IS NOT NULL

或者…

SELECT T.*
FROM dbo.Table1 T
    JOIN Table2 T2 ON T.ID = T2.Table1ID
UNION
SELECT T.*
FROM dbo.Table1 T
    JOIN Table3 T3 ON T.ID = T3.Table1ID

我尝试过同时运行这两个程序,但是很难确定。我会很高兴地解释一个为什么比另一个更快,或者这取决于情况。


阅读 191

收藏
2021-05-23

共1个答案

小编典典

您的两个查询不做相同的事情。特别是,如果两个表中的值重复,则第一个将返回重复的行。

如果要Table1在其他两个表中的任何一个中查找行,我建议使用exists

select t1.*
from Table1 t1
where exists (select 1 from Table2 t2 where t2.Table1Id = t1.id) or
      exists (select 1 from Table3 t3 where t3.Table1Id = t1.id);

并且,Table1IdTable2和中都创建索引Table3

您的原始查询哪个更快,很大程度上取决于数据。第二步有一个额外的步骤来删除重复项(union经节union all)。另一方面,第一个可能最终会创建许多重复的行。

2021-05-23