在网看到以下内容:
1: where column in(select * from ... where ...); 
2:... where exists (select 'X' from ...where ...); 
第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询,使用EXIST,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间 ;Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中。
我自己测试了,
select e.*   from emp e where   exists(select * from dept d where e.deptno=d.deptno);
select e.*   from emp e where e.DEPTNO in(select d.DEPTNO from dept d );
似乎是后面一句的效率要高些,请大家帮忙解惑!谢谢!

解决方案 »

  1.   

    exits适合内小外大的查询,in适合内大外小的查询 ,
    就是说子查询得出的记录较少,主查询中的表较大且又有索引时应该用in。不知楼主的例子是否为上边的情况,如果不是,只能看看执行计划了。
      

  2.   

    select 'X' from ...where ...) 如果结果集大 用IN要快的多
    相反 用EXISTS要快的多个人意见..
      

  3.   

    不好意思 刚上面正好写反了
    马虎了..(select d.DEPTNO from dept d ) 这个结果集大用EXISTS
    相反用IN 如果是取维度表 也就是代码表 还是用IN合适如果是取ID对应ID还是用EXISTS
      

  4.   

    ....可以这样理解吧,用IN的话,会一直遍历到最后一个数据才返回,用EXISTS的话,遇到符合的数据就马上返回了.这样的话,IN的损耗时间就比EXISTS多.
    举个例子吧,1 IN (2,1,3,4)  这样的句子会一直检索到4才返回, 当用EXISTS的话,当检索到1的时候,就马上返回的了