我有两个表机构和结果,我想看看是否有任何结果的机构,我可以排除那些没有结果.
使用JOIN或使用EXISTS可以获得更好的性能吗?
谢谢你,
-Nimesh
根据语句,统计信息和数据库服务器,它可能没有区别 - 可能会生成相同的优化查询计划.
DB基本上有3种方式连接表:
嵌套循环 - 一个比第二个大得多的表.检查较小表中的每一行是否有较大的每一行.
合并 - 对于相同排序顺序的两个表.两者都按顺序运行并匹配它们对应的位置.
哈希 - 其他一切.临时表用于构建匹配.
通过使用exists,您可以有效地强制查询计划执行嵌套循环.这可能是最快捷的方式,但实际上您需要查询计划程序来决定.
我想说你需要编写两个SQL语句并比较查询计划.根据您拥有的数据,您可能会发现它们会发生相当大的变化.
例如,如果[INSTIT]和[Results]是相似的大小,并且两者都集中在InstitutionID上,则合并连接将是最快的.如果[Results]比[INSTIT]大得多,嵌套循环可能会更快.
这取决于.
最终,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"
这取决于你的优化器.我在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