锁定老帖子 主题:in 和 exists的区别 用数据说话
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2012-05-04
inter12 写道 简单的说 in 是先内表,后外表,exist是先外表,后内表。
几个判断依据: 1.是否存在排序,排序都是耗资源的 2.是否走索引 |
|
返回顶楼 | |
发表时间:2012-05-04
用例4是内表大,外表小吧~
|
|
返回顶楼 | |
发表时间: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比较适用。 |
|
返回顶楼 | |
发表时间: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内查询和外查询是否用到了索引 |
|
返回顶楼 | |
发表时间: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的时候不管是否符合都要经行所有条件判断 - -),谢谢指教!! |
|
返回顶楼 | |
发表时间:2012-05-04
其实in和exists既然存在都有他们的作用,一般建议:
1、如果限制性强的条件在子查询,用in 2、如果限制性强的条件在主查询,用exists 具体还是看执行计划去分析,现在oracle的引擎大部分是基于CBO,依赖统计信息作出最优执行计划,如果sql语句简单的话,in有时候会被转化成嵌套链接,用in还是exist是具体看执行计划哪种消耗资源最少。 |
|
返回顶楼 | |
发表时间:2012-05-05
最后修改:2012-05-05
a5728238 写道 其实in和exists既然存在都有他们的作用,一般建议:
1、如果限制性强的条件在子查询,用in 2、如果限制性强的条件在主查询,用exists 具体还是看执行计划去分析,现在oracle的引擎大部分是基于CBO,依赖统计信息作出最优执行计划,如果sql语句简单的话,in有时候会被转化成嵌套链接,用in还是exist是具体看执行计划哪种消耗资源最少。 对,直接看查询计划,查询计划就是建议 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2012-05-07
create index idx_customer_registerTime on base_customer(registerTime); base_customer 100w条 uuid 主键 customerId 唯一索引
|
|
返回顶楼 | |
发表时间:2012-05-07
hedahai119 写道
create index idx_customer_registerTime on base_customer(registerTime); base_customer 100w条 uuid 主键 customerId 唯一索引
unique(customerId) 通过这个加的 |
|
返回顶楼 | |