锁定老帖子 主题:in 和 exists的区别 用数据说话
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2012-05-25
最后修改:2012-05-25
楼主涉猎很广啊,从spring到oracle,投资涉及各个行业
|
|
返回顶楼 | |
发表时间:2012-05-25
受教了~~~~~
|
|
返回顶楼 | |
发表时间:2012-05-28
你笑的真灿烂
|
|
返回顶楼 | |
发表时间:2012-05-28
faithsunsun 写道 你笑的真灿烂
|
|
返回顶楼 | |
发表时间:2012-05-28
楼主,那种情况下,走的快些,又安全些呢?
|
|
返回顶楼 | |
发表时间:2012-05-29
什么是内表 外表 ? select id from tb1 where id in (select id from tb1 ) tb1是内表 还是外表?
|
|
返回顶楼 | |
发表时间:2012-05-29
刚看第一眼 找到一个不规范的写法
insert表一定要带字段名 否则表扩展,就会出问题 当然 你这里只是为了测试另外的东西 所以。。。 我只是顺便一提 还没看完 |
|
返回顶楼 | |
发表时间:2012-05-29
crespo1414 写道 刚看第一眼 找到一个不规范的写法
insert表一定要带字段名 否则表扩展,就会出问题 当然 你这里只是为了测试另外的东西 所以。。。 我只是顺便一提 还没看完 是的 |
|
返回顶楼 | |
发表时间:2012-05-29
神了,这几天正好在看类似的问题,有了这个很好参考
|
|
返回顶楼 | |
发表时间: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次吗? |
|
返回顶楼 | |