月挂夜中央

懒惰程序员

常用链接

统计

最新评论

oracle中in,not in和exists,not exists之间的区别

         一直听到的都是说尽量用exists不要用in,因为exists只判断存在而in需要对比值,所以exists比较快,但看了看网上的一些东西才发现根本不是这么回事。
下面这段是抄的
Select * from T1 where x in ( select y from T2 )
执行的过程相当于:
select *
  from t1, ( select distinct y from t2 ) t2
 where t1.x = t2.y;

select * from t1 where exists ( select null from t2 where y = x )
执行的过程相当于:
for x in ( select * from t1 )
   loop
      if ( exists ( select null from t2 where y = x.x )
      then
         OUTPUT THE RECORD
      end if
end loop

从我的角度来说,in的方式比较直观,exists则有些绕,而且in可以用于各种子查询,而exists好像只用于关联子查询(其他子查询当然也可以用,可惜没意义)。
由于exists是用loop的方式,所以,循环的次数对于exists影响最大,所以,外表要记录数少,内表就无所谓了,而in用的是hash join,所以内表如果小,整个查询的范围都会很小,如果内表很大,外表如果也很大就很慢了,这时候exists才真正的会快过in的方式。
         下面这段还是抄的
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
而not extsts 的子查询依然能用到表上的索引。
所以无论那个表大,用not exists都比not in要快。
          也就是说,in和exists需要具体情况具体分析,not in和not exists就不用分析了,尽量用not exists就好了。


我的微博 http://t.sina.com.cn/1401900445

posted on 2009-01-07 15:03 月挂夜中央 阅读(6255) 评论(2)  编辑  收藏 所属分类: SQL很强大

评论

# re: oracle中in,not in和exists,not exists之间的区别 2009-01-09 10:04 jyojyo

in 语句翻译成内连接, 内连接到最后还不是做loop?
所以有区别吗?  回复  更多评论   

# re: oracle中in,not in和exists,not exists之间的区别 2009-01-12 08:30 月挂夜中央

@jyojyo

典型的连接类型共有3种:
排序 - - 合并连接(Sort Merge Join (SMJ) )
嵌套循环(Nested Loops (NL) )
哈希连接(Hash Join)

嵌套循环和哈希连接的算法还是有不同,在理论上哈希连接要快过排序和nl,当然实际情况比理论上有复杂的多,不过两者还是有差异的  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: