使用JOIN或使用EXISTS可以获得更好的性能吗?

28 sql performance

我有两个表机构和结果,我想看看是否有任何结果的机构,我可以排除那些没有结果.

使用JOIN或使用EXISTS可以获得更好的性能吗?

谢谢你,
-Nimesh

Kei*_*ith 18

根据语句,统计信息和数据库服务器,它可能没有区别 - 可能会生成相同的优化查询计划.

DB基本上有3种方式连接表:

  • 嵌套循环 - 一个比第二个大得多的表.检查较小表中的每一行是否有较大的每一行.

  • 合并 - 对于相同排序顺序的两个表.两者都按顺序运行并匹配它们对应的位置.

  • 哈希 - 其他一切.临时表用于构建匹配.

通过使用exists,您可以有效地强制查询计划执行嵌套循环.这可能是最快捷的方式,但实际上您需要查询计划程序来决定.

我想说你需要编写两个SQL语句并比较查询计划.根据您拥有的数据,您可能会发现它们会发生相当大的变化.

例如,如果[INSTIT]和[Results]是相似的大小,并且两者都集中在InstitutionID上,则合并连接将是最快的.如果[Results]比[INSTIT]大得多,嵌套循环可能会更快.


Bob*_*bst 14

这取决于.

最终,2服务于完全不同的目的.

您加入2个表来访问相关记录.如果您不需要访问相关记录中的数据,则无需加入它们.

EXISTS可用于确定令牌是否存在于给定数据集中,但不允许您访问相关记录.

发布您想到的两种方法的示例,我可能会给您一个更好的主意.


使用您的两个表机构和结果如果您想要一个有结果的机构列表,这个查询将是最有效的:

select Institutions.institution_name 
from Institutions
inner join Results on (Institutions.institution_id = Results.institution_id)
Run Code Online (Sandbox Code Playgroud)

如果您有institution_id并且只想知道它是否有结果,那么使用EXISTS可能会更快:

if exists(select 1 from Results where institution_id = 2)
  print "institution_id 2 has results"
else
  print "institution_id 2 does not have results"
Run Code Online (Sandbox Code Playgroud)


Kon*_*Kon 6

无论是否存在性能差异,您都需要使用更适合您的目的。您的目的是获取机构列表(不是结果 - 您不需要额外的数据)。所以选择没有结果的机构......翻译 - 使用 EXISTS。


Kon*_*Kon 5

我会说 JOIN 较慢,因为只要 EXISTS 调用找到某些内容,您的查询执行就会停止,而 JOIN 将持续到最后。

编辑:但这取决于查询。这应该根据具体情况进行判断。

  • 很高兴你没有删除它 - 它提供了有用的见解!(存在短路...) (5认同)

Jos*_*ons 5

这取决于你的优化器.我在Oracle 10g和11g中尝试了以下两个.在10克,第二个稍快.在11克,他们是相同的.

但是,#1实际上是对EXISTS条款的滥用.使用联接查找匹配项.

select *
from
  table_one t1
where exists (
             select *
             from table_two t2
             where t2.id_field = t1.id_field
             )
order by t1.id_field desc


select t1.*
from 
  table_one t1
 ,table_two t2
where t1.id_field = t2.id_field
order by t1.id_field desc 
Run Code Online (Sandbox Code Playgroud)


Bry*_*ynJ 0

如果您指的是使用左(或右)外连接或不存在的子查询,我相当确定左外连接在性能方面获胜。例如:

SELECT t1.* FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.id = t2.id WHERE t2.id IS NULL

上面的内容应该比等效的子查询更快,如果您专门指的是存在 - 那么,在结构允许的情况下,内部联接将始终是首选选项。