ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle in && exists

Oracle in && exists

原创 Linux操作系统 作者:spritesong 时间:2009-03-29 20:47:57 0 删除 编辑

复习一下in&exist语法:
一般来讲in是对外表和内表作Hash Join,而exist是对外表和内表做了一个nested loop,也就是说,对于exist,针对外表(需要遍历其所有内容)需要遍历的每一行,都会对内表进行一次查询,因此如果外表和内表大小相当,in和 exist在性能的差别上就不是很大:)
如果两个表中一个是较小的表,一个是较大的表,如果内表大则用exists性能会更好(因为外表小了,遍历的行次数就少了很多),内表表小的用in性能会更好。

举个例子:
例如:表A(小表),表B(大表),CC列上有索引
在外表小,内表大的情况下用in(Hash Join A和B两个表).效率就会很低,比如:
select * from A where cc in (select cc from B)
这个时候查询用到了A表上cc列的索引,但是因为A是小表,而且大表B上的索引也没有充分利用,因此效率不高

而如果用了exist,我们发现走的是对A,B两个表的nested Loop,对于遍历A的每一行,都会对大表B进行一次查询(可能对B表的查询结果不是太多.)
select * from A where exists(select cc from B where cc=A.cc)
这样效率会高些,因为用到了B表(大表)上cc列的索引

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/293106/viewspace-580544/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-28

  • 博文量
    62
  • 访问量
    23725