两个左联接vs联盟的表现

时间:2014-07-18 16:05:15

标签: sql sql-server performance left-join union

我搜索过但没有找到明确的答案。其中哪一个更适合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

我尝试过两者都跑,但很难确定。我很欣赏为什么一个比另一个更快,或者它取决于具体情况的解释。

1 个答案:

答案 0 :(得分:4)

您的两个查询不会执行相同的操作。特别是,如果值在任一表中重复,则第一个将返回重复的行。

如果您要查找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)。另一方面,第一个可能最终会创建许多重复的行。