两个左连接与联合的性能

may*_*lle 5 sql sql-server performance union left-join

我已经搜索过,但没有找到明确的答案。以下哪个对 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
Run Code Online (Sandbox Code Playgroud)

或者...

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
Run Code Online (Sandbox Code Playgroud)

我试过同时运行两者,但很难确定。我很感激解释为什么一个比另一个更快,或者这取决于具体情况。

Gor*_*off 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);
Run Code Online (Sandbox Code Playgroud)

并且,Table1Id在 和 中Table2创建索引Table3

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