论坛首页 综合技术论坛

in 和 exists的区别 用数据说话

浏览 41169 次
该帖已经被评为良好帖
作者 正文
   发表时间:2012-05-25   最后修改:2012-05-25
楼主涉猎很广啊,从spring到oracle,投资涉及各个行业
0 请登录后投票
   发表时间:2012-05-25  
受教了~~~~~
0 请登录后投票
   发表时间:2012-05-28  
你笑的真灿烂
0 请登录后投票
   发表时间:2012-05-28  
faithsunsun 写道
你笑的真灿烂

0 请登录后投票
   发表时间:2012-05-28  
楼主,那种情况下,走的快些,又安全些呢?
0 请登录后投票
   发表时间:2012-05-29  
什么是内表  外表  ?   select id from tb1 where id in (select id from tb1 )   tb1是内表  还是外表?
0 请登录后投票
   发表时间:2012-05-29  
刚看第一眼 找到一个不规范的写法
insert表一定要带字段名 否则表扩展,就会出问题

当然 你这里只是为了测试另外的东西 所以。。。
我只是顺便一提 还没看完
0 请登录后投票
   发表时间:2012-05-29  
crespo1414 写道
刚看第一眼 找到一个不规范的写法
insert表一定要带字段名 否则表扩展,就会出问题

当然 你这里只是为了测试另外的东西 所以。。。
我只是顺便一提 还没看完

是的
0 请登录后投票
   发表时间:2012-05-29  
神了,这几天正好在看类似的问题,有了这个很好参考
0 请登录后投票
   发表时间:2012-05-30   最后修改:2012-05-30
引用

举个例子:
例如:表A(小表),表B(大表),CC列上有索引
在外表小,内表大的情况下用in(Hash Join A和B两个表).效率就会很低,比如:
select * from A where cc in (select cc from B)
这个时候查询用到了A表上cc列的索引,但是因为A是小表,而且大表B上的索引也没有充分利用,因此效率不高

而如果用了exist,我们发现走的是对A,B两个表的nested Loop,对于遍历A的每一行,都会对大表B进行一次查询(可能对B表的查询结果不是太多.)
select * from A where exists(select cc from B where cc=A.cc)
这样效率会高些,因为用到了B表(大表)上cc列的索引。

not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
而not extsts 的子查询依然能用到表上的索引。
所以无论那个表大,用not exists都比not in要快。

内表外表我不明白是什么意思,楼主的贴我没看明白。我只是看明白另外一篇讨论(如上),这篇从索引角度分析了exists和in的效率,很好懂,然而对下面的我就看不懂了为什么了,有人能解释一下吗?(我连什么叫外表,驱动表,内表的定义,为什么这么叫都不知道。。。)


引用

简单的说 in 是先内表,后外表,exist是先外表,后内表。
几个判断依据:
1.是否存在排序,排序都是耗资源的
2.是否走索引


这里讲了in和exist的执行顺序是不一样的。有人能用java程序写下exists和in的实现代码吗?
为什么顺序不一样,导致效率是不一样的?
如果外表是m行,内表是n行,不管先外后内,还是先内后外,结果不也是要循环m*n次吗?


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

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