Sql 两个左联接对并集的性能
我已经搜索过了,但没有找到确切的答案。以下哪项对SQL Server的性能更有利:Sql 两个左联接对并集的性能,sql,sql-server,performance,left-join,union,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
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
或者
我试过两种方法,但很难确定。我希望您能解释一下为什么一个比另一个快,或者这取决于具体情况。您的两个查询做的事情并不相同。特别是,如果两个表中的值都重复,则第一个表将返回重复的行 如果您在
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);
并且,在Table2
和Table3
中的Table1Id
上创建索引
哪一个原始查询更快在很大程度上取决于数据。第二步是删除重复项(
union
vsunion all
)。另一方面,第一个可能会创建许多重复的行。请查看执行计划。如果您在这里找不到好的答案,您可能希望尝试DBA堆栈交换:请务必包含其他信息,如执行计划
或定义的索引。为什么在此设置中使用左连接?在我看来,您应该使用内部联接。@之所以使用Limey-Left联接,是因为内部联接将返回t2和t3中都存在的行,而我需要其中一个,但不一定两者都需要。戈登的回答在这里非常完美。谢谢谢谢你的清楚解释!最初我打算从t2和t3返回一些值,这就是为什么我在leftjoin
和union
之间争论的原因,但后来我发现我不需要它们,并且忘记了我应该使用exists
。关于副本,这一点也很好。我注意到,在我发布问题后,我计划使用distinct
,但这当然也会恶化性能。谢谢
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);