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)
我会说 JOIN 较慢,因为只要 EXISTS 调用找到某些内容,您的查询执行就会停止,而 JOIN 将持续到最后。
编辑:但这取决于查询。这应该根据具体情况进行判断。
这取决于你的优化器.我在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)
如果您指的是使用左(或右)外连接或不存在的子查询,我相当确定左外连接在性能方面获胜。例如:
SELECT t1.* FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.id = t2.id WHERE t2.id IS NULL
上面的内容应该比等效的子查询更快,如果您专门指的是存在 - 那么,在结构允许的情况下,内部联接将始终是首选选项。