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)
我试过同时运行两者,但很难确定。我很感激解释为什么一个比另一个更快,或者这取决于具体情况。
您的两个查询不会执行相同的操作。特别是,如果任一表中的值重复,第一个将返回重复行。
如果您正在查找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)。另一方面,第一个可能最终会创建许多重复行。