论坛首页 综合技术论坛

in 和 exists的区别 用数据说话

浏览 41172 次
该帖已经被评为良好帖
作者 正文
   发表时间:2012-05-04  
inter12 写道
简单的说 in 是先内表,后外表,exist是先外表,后内表。
几个判断依据:
1.是否存在排序,排序都是耗资源的
2.是否走索引


0 请登录后投票
   发表时间:2012-05-04  
用例4是内表大,外表小吧~
0 请登录后投票
   发表时间:2012-05-04  
inter12 写道
简单的说 in 是先内表,后外表,exist是先外表,后内表。
几个判断依据:
1.是否存在排序,排序都是耗资源的
2.是否走索引


   上面这位兄弟说的很好,我再加点个人看法:
   例如条件a和条件b(b为in或exist后的条件).
  用in的话就是if(b==true)
               if(a==true)
                      ...
  用exist的话就是if(a==true)
               if(b==true)
                      ...
所以个人感觉还是exist比较适用。
0 请登录后投票
   发表时间:2012-05-04  
crxing 写道
inter12 写道
简单的说 in 是先内表,后外表,exist是先外表,后内表。
几个判断依据:
1.是否存在排序,排序都是耗资源的
2.是否走索引


   上面这位兄弟说的很好,我再加点个人看法:
   例如条件a和条件b(b为in或exist后的条件).
  用in的话就是if(b==true)
               if(a==true)
                      ...
  用exist的话就是if(a==true)
               if(b==true)
                      ...
所以个人感觉还是exist比较适用。

不赞同,用in和exist取决于a=true 或者b==true的代价,取决于
1外表和内表的大小
2内查询和外查询是否用到了索引
0 请登录后投票
   发表时间:2012-05-04  
kakaluyi 写道
crxing 写道
inter12 写道
简单的说 in 是先内表,后外表,exist是先外表,后内表。
几个判断依据:
1.是否存在排序,排序都是耗资源的
2.是否走索引


   上面这位兄弟说的很好,我再加点个人看法:
   例如条件a和条件b(b为in或exist后的条件).
  用in的话就是if(b==true)
               if(a==true)
                      ...
  用exist的话就是if(a==true)
               if(b==true)
                      ...
所以个人感觉还是exist比较适用。

不赞同,用in和exist取决于a=true 或者b==true的代价,取决于
1外表和内表的大小
2内查询和外查询是否用到了索引

   哦,理解错了(一直以为用in的时候不管是否符合都要经行所有条件判断 - -),谢谢指教!!
0 请登录后投票
   发表时间:2012-05-04  
其实in和exists既然存在都有他们的作用,一般建议:
1、如果限制性强的条件在子查询,用in
2、如果限制性强的条件在主查询,用exists

具体还是看执行计划去分析,现在oracle的引擎大部分是基于CBO,依赖统计信息作出最优执行计划,如果sql语句简单的话,in有时候会被转化成嵌套链接,用in还是exist是具体看执行计划哪种消耗资源最少。
0 请登录后投票
   发表时间:2012-05-05   最后修改:2012-05-05
a5728238 写道
其实in和exists既然存在都有他们的作用,一般建议:
1、如果限制性强的条件在子查询,用in
2、如果限制性强的条件在主查询,用exists

具体还是看执行计划去分析,现在oracle的引擎大部分是基于CBO,依赖统计信息作出最优执行计划,如果sql语句简单的话,in有时候会被转化成嵌套链接,用in还是exist是具体看执行计划哪种消耗资源最少。

对,直接看查询计划,查询计划就是建议 
0 请登录后投票
   发表时间:2012-05-07  
大部分情况下  in 和 exists 的效果都是差不多的,
至于执行计划都可以通过加hint而让其一致。
这里简单的补充一点 ,not in 和not exists 不是所有情况下都能相互replace,
with temp1 as(select decode(rownum,1,1,2,1)a,
                     decode(rownum,1,1,2,2)b
               from dual connect by rownum<3),
      temp2 as(select decode(rownum,1,1,2,1)a,
                      decode(rownum,1,1,2,'')b
                from dual connect by rownum<3)
                   
                select * from temp1 t1
                where t1.b not in (select t2.b from temp2 t2)
                 --没有返回值
                   select * from temp1 t1
                where not exists
                  (select 1 from temp2 t2 where t1.b=t2.b)         
                   --返回 1 2
0 请登录后投票
   发表时间:2012-05-07  
create index idx_customer_registerTime on base_customer(registerTime);  

base_customer      100w条  
    uuid 主键  
    customerId 唯一索引  




楼主你给表&quot;base_customer&quot;的索引建错了~~~

希望你是笔误,不然你这个就白测了~~

 

0 请登录后投票
   发表时间:2012-05-07  
hedahai119 写道
create index idx_customer_registerTime on base_customer(registerTime);  

base_customer      100w条  
    uuid 主键  
    customerId 唯一索引  




楼主你给表&quot;base_customer&quot;的索引建错了~~~

希望你是笔误,不然你这个就白测了~~

 

unique(customerId)   通过这个加的 

0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics