你这3个值都是定死了,用不着子查询了,干嘛还要用Exists 有两例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。 2) select * from T1 where T1.a in (select T2.a from T2) ; T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
in是对外表和内表做hash join; exist是对外表做loop,每次loop值再对内表做查询。
另外需要特别注意的是,in和exist的区别只在10.2.0.3及以前的版本中存在;而10.2.0.4及以后的版本中,in和exist的效果是完全一样的,手册中也删除了有关二者区别的说明。
有两例子,以说明 “exists”和“in”的效率问题
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
这个不一定吧?如果基于规则,in会相当于or,即会对in里面的每个值内容采用索引形式查询,如果基于成本,会先分析情况,有可能采用or扩展,hash join,转换成exist等等
in和exist的效果在很复杂的sql中还是会出现不一样的效果的,因为有些时候sql转换很难或者强制了使用某些索引
这个不一定吧?如果基于规则,in会相当于or,即会对in里面的每个值内容采用索引形式查询,如果基于成本,会先分析情况,有可能采用or扩展,hash join,转换成exist等等
in和exist的效果在很复杂的sql中还是会出现不一样的效果的,因为有些时候sql转换很难或者强制了使用某些索引
in和exist很多时候还要考虑到表数据之间的关联性,如果跳出了具体数据,但只说in和exist的差别,某些时候会经常判断不对