ORACLE in与exists语句的区别

原创 2016年05月30日 11:27:14

select * from A
where id in(select id from B)

以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录.
它的查询过程类似于以下过程

List resultSet=[];
Array A=(select * from A);
Array B=(select id from B);

for(int i=0;i<A.length;i++) {
   for(int j=0;j<B.length;j++) {
      if(A[i].id==B[j].id) {
         resultSet.add(A[i]);
         break;
      }
   }
}
return resultSet;

可以看出,当B表数据较大时不适合使用in(),因为它会B表数据全部遍历一次.
如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历10000*1000000次,效率很差.
再如:A表有10000条记录,B表有100条记录,那么最多有可能遍历10000*100次,遍历次数大大减少,效率大大提升.

结论:in()适合B表比A表数据小的情况

select a.* from A a
where exists(select 1 from B b where a.id=b.id)

以上查询使用了exists语句,exists()会执行A.length次,它并不缓存exists()结果集,因为exists()结果集的内容并不重要,重要的是结果集中是否有记录,如果有则返回true,没有则返回false.
它的查询过程类似于以下过程

List resultSet=[];
Array A=(select * from A)

for(int i=0;i<A.length;i++) {
   if(exists(A[i].id) {    //执行select 1 from B b where b.id=a.id是否有记录返回
       resultSet.add(A[i]);
   }
}
return resultSet;

当B表比A表数据大时适合使用exists(),因为它没有那么遍历操作,只需要再执行一次查询就行.
如:A表有10000条记录,B表有1000000条记录,那么exists()会执行10000次去判断A表中的id是否与B表中的id相等.
如:A表有10000条记录,B表有100000000条记录,那么exists()还是执行10000次,因为它只执行A.length次,可见B表数据越多,越适合exists()发挥效果.
再如:A表有10000条记录,B表有100条记录,那么exists()还是执行10000次,还不如使用in()遍历10000*100次,因为in()是在内存里遍历比较,而exists()需要查询数据库,我们都知道查询数据库所消耗的性能更高,而内存比较很快.

结论:exists()适合B表比A表数据大的情况

当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用.

Oracle中的EXISTS与IN使用区别

使用EXISTS比使用IN通常查询速度快的原因: 通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。 Oracle在执行IN子查询时,首先执行...
  • qq_27918787
  • qq_27918787
  • 2016年09月13日 09:40
  • 637

exists与in的区别以及exists在oracle与mysql中的语句写法

一、EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用: IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情...
  • bjxdyl1995
  • bjxdyl1995
  • 2017年03月09日 15:31
  • 205

关于Oracle中in和exists的区别

1、关于在 Oracle8i  时代中in和exists的区别   这里有条SQL语句:select * from A where id in(select id from B)  以上查询使...
  • okh258
  • okh258
  • 2015年12月17日 16:55
  • 2987

in、or、exists区别

in 和or区别: 如果in和or所在列有索引或者主键的话,or和in没啥差别,执行计划和执行时间都几乎一样。 如果in和or所在列没有 索引的话,性能差别就很大了。在没有索引的情况下,随着in或...
  • qq_34783818
  • qq_34783818
  • 2017年03月07日 20:04
  • 316

sql中exists的用法及与in的比较

EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False 有一个查询如下: 复制代码 代码如下: SELECT c.Cu...
  • zisongjia
  • zisongjia
  • 2016年09月19日 11:52
  • 439

详解not in与not exists的区别与用法(not in的性能并不差!)

在网上搜了下关于oracle中not exists和not in性能的比较,发现没有描述的太全面的,可能是问题太简单了,达人们都不屑于解释吧。于是自己花了点时间,试图把这个问题简单描述清楚,其实归根结...
  • johnjobs
  • johnjobs
  • 2013年09月29日 17:06
  • 2257

sql语句中exists和in用法的区分

初学java两个多月,这两天在整理老师的笔记对数据库中的exists和in的用法分不清楚,从网上搜了些资料,作了点总结。 一、问题起因 起初是由两条语句执行结果不同,语句如下: --分析以下结果...
  • U___U
  • U___U
  • 2015年03月27日 15:25
  • 4474

oracle中的exists和not exists和in用法详解

有两个简单例子,以说明 “exists”和“in”的效率问题   1) select * from T1 where exists(select 1 from T2 where T1.a=T2....
  • junshuaizhang
  • junshuaizhang
  • 2014年06月25日 15:19
  • 2006

not in 与not exists区别

1、对于not  exists查询,内表存在空值对查询结果没有影响;对于not  in查询,内表存在空值将导致最终的查询结果为空。 2、对于not  exists查询,外表存在空值,存在空值的那条记...
  • u012191627
  • u012191627
  • 2015年04月16日 16:47
  • 674

ORACLE in与exists语句的区别

select * from A where id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的i...
  • xiaofuruo
  • xiaofuruo
  • 2014年01月02日 00:01
  • 588
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ORACLE in与exists语句的区别
举报原因:
原因补充:

(最多只允许输入30个字)