Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 两个左联接对并集的性能_Sql_Sql Server_Performance_Left Join_Union - Fatal编程技术网

Sql 两个左联接对并集的性能

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 或者 我试过两种方法,但很难确定。我希望您能解释一

我已经搜索过了,但没有找到确切的答案。以下哪项对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
或者


我试过两种方法,但很难确定。我希望您能解释一下为什么一个比另一个快,或者这取决于具体情况。

您的两个查询做的事情并不相同。特别是,如果两个表中的值都重复,则第一个表将返回重复的行

如果您在
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
vs
union all
)。另一方面,第一个可能会创建许多重复的行。

请查看执行计划。如果您在这里找不到好的答案,您可能希望尝试DBA堆栈交换:请务必包含其他信息,如
执行计划
或定义的索引。为什么在此设置中使用左连接?在我看来,您应该使用内部联接。@之所以使用Limey-Left联接,是因为内部联接将返回t2和t3中都存在的行,而我需要其中一个,但不一定两者都需要。戈登的回答在这里非常完美。谢谢谢谢你的清楚解释!最初我打算从t2和t3返回一些值,这就是为什么我在left
join
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);