当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《使用JOIN或使用EXISTS可以获得更好的性能吗?》经验,为你挑选了3个好方法。

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

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

谢谢你,
-Nimesh



1> Keith..:

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

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

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

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

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

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

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

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



2> Bob Probst..:

这取决于.

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

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

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

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


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

select Institutions.institution_name 
from Institutions
inner join Results on (Institutions.institution_id = Results.institution_id)

如果您有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"



3> JosephStyons..:

这取决于你的优化器.我在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 

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有