in与exist , not in与not exist 的区别 【轉】
2015-12-11 08:59
211 查看
in和exists in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。 如果查询的两个表大小相当,那么用in和exists差别不大。 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: 例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B) 效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc) 效率高,用到了B表上cc列的索引。 相反的2:select * from B where cc in (select cc from A) 效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc) 效率低,用到了A表上cc列的索引。 not in 和not exists 如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。 not in 逻辑上不完全等同于not exists,如果你误用了not in,小心你的程序存在致命的BUG: 请看下面的例子: create table t1 (c1 number,c2 number); create table t2 (c1 number,c2 number); insert into t1 values (1,2); insert into t1 values (1,3); insert into t2 values (1,2); insert into t2 values (1,null); select * from t1 where c2 not in (select c2 from t2); no rows found select * from t1 where not exists (select 1 from t2 where t1.c2=t2.c2); c1 c2 1 3 正如所看到的,not in 出现了不期望的结果集,存在逻辑错误。如果看一下上述两个select语句的执行计划,也会不同。后者使用了hash_aj。 因此,请尽量不要使用not in(它会调用子查询),而尽量使用not exists(它会调用关联子查询)。如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录,正如上面例子所示。 除非子查询字段有非空限制,这时可以使用not in ,并且也可以通过提示让它使用hasg_aj或merge_aj连接
原轉文地址 http://blog.csdn.net/liuxilil/article/details/6718409 ==>人家也是转的,没有注明原文出处,我就更找不到了。
今天是真的感受了一下 Not In 和 Not Exists之间的差别。两个大表,使用Not In 等待了十几分钟没出来结果,只能中断执行。使用Not Exists,1分多搞定收工。
相关文章推荐
- 重载
- 【代码笔记】侧滑效果
- 第四周 项目六 多项式求和
- 【代码笔记】侧滑效果
- 如何看代码的架构
- A-8 8 Which of these appropriately describes the results of a manual SQL Tuning Advisor task? A. A l
- iOS开发-UI控件:修改textField的placeholder的字体颜色、大小
- 谁偷走了我们的时间?
- 第十五周项目二----用哈希法组织关键字之链地址法
- CART回归树&模型树 生成 剪枝 in Python
- 利用策略模式对用户模块的一个设计
- 一步步学习javascript基础篇(6):函数表达式之【闭包】
- 第十二周项目5-迷宫问题之图深度优先遍历算法
- PHP开发中AJAX技术的简单应用
- WPF的TextBox产生内存泄露的情况
- 第15周项目1 验证算法
- 第9周项目2对阵矩阵压缩存储的实现与应用2
- 使用FUSE挂载HDFS流程及错误集锦
- Xcode7使用MJ的NSObject+Value出现Too many arguments to function call,expected 0,have 3
- svn更新代码后,工程打不开的解决方法