in与exist , not in与not exist 的区别

转载 2013年12月05日 12:28:56

inexists
    in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为existsin效率高的说法是不准确的。
    如果查询的两个表大小相当,那么用inexists差别不大。
    如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in  

    例如:表A(小表),表B(大表)1select * 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列的索引。
相反的2select * 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_ajmerge_aj连接。

相关文章推荐

in exist not_in

  • 2013年03月22日 15:35
  • 31KB
  • 下载

java.lang.IllegalArgumentException: Positional parameter does not exist: 1 in query解决

环境 Eclipse Indigo + Hibernate3.2 + Oracle 11gR2 + SQLPlus   问题 运行Hibernate程序,报如下异常   java.lang.Illeg...
  • Wentasy
  • Wentasy
  • 2012年12月10日 17:29
  • 8147

The type or namespace name 'Zhaopin' does not exist in the namespace 'LMSoft' 问题的解决

今天,由于我随手改了几个cs命名空间的名称。原来是LMSoft.Zhaopin,改为了LMSoft.Web。这是因为我的项目名称已经改为LMSoft.Web。原来的项目名称是LMSoft.Zhaopi...
  • sxf359
  • sxf359
  • 2017年01月01日 18:16
  • 695

Agile PLM: 启动时匪夷所思的的Node (18387 , 2490533) does not exist in the cache

问题描述 Agile管理员配置一个Gate SubClass(ID为18401)级别的Page Three属性,ID为2490533,业务操作均无问题。偶然的一次重启服务后出现Node (18387...

Number range for trans./event type WA in year 2011 does not exist

分析其原因是系统没有维护2011凭证文档运行TCODE:OMBT选择“WA”所在的组 -- 点Pen...

The name 'Profile' does not exist in the current context

在使用 ProfileCommon profile = Profile.GetProfile(myuser.ToString()); 来取得一个用户的profile信息的时候,出现错误提示:The...
  • kofkyo
  • kofkyo
  • 2012年07月11日 12:53
  • 5737

CS0234 The type or namespace name 'Mvc' does not exist in the namespace 'Microsoft.AspNet' (are you

CS0234 The type or namespace name 'Mvc' does not exist in the namespace 'Microsoft.AspNet' (are you ...

IN 和 EXIST的区别

  • 2012年05月22日 06:59
  • 38KB
  • 下载

sql中的in 和 exist 区别

select * from A where id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:in与exist , not in与not exist 的区别
举报原因:
原因补充:

(最多只允许输入30个字)