我已经搜索过,但没有找到明确的答案。以下哪一项对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
我尝试过同时运行这两个程序,但是很难确定。我会很高兴地解释一个为什么比另一个更快,或者这取决于情况。
您的两个查询不做相同的事情。特别是,如果两个表中的值重复,则第一个将返回重复的行。
如果要Table1在其他两个表中的任何一个中查找行,我建议使用exists:
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);
并且,Table1Id在Table2和中都创建索引Table3。
Table1Id
Table2
Table3
您的原始查询哪个更快,很大程度上取决于数据。第二步有一个额外的步骤来删除重复项(union经节union all)。另一方面,第一个可能最终会创建许多重复的行。
union
union all