in 和 exists 的比较

EXISTS的执行流程     
select * from t1 where exists ( select null from t2 where y = x )
可以理解为:
  for x in ( select * from t1 )
  loop
      if ( exists ( select null from t2 where y = x.x )
      then
        OUTPUT THE RECORD
      end if
  end loop


in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。

not exists:做NL,对子查询先查,有个虚表,有确定值,所以就算子查询有NULL最终也有值返回

not in:做hash,对子查询表建立内存数组,用外表匹配,那子查询要是有NULL那外表没的匹配最终无值返回。
    一直以来认为exists比in效率高的说法是不准确的。


对于in 和 exists的性能区别:
  如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
  其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了,另外,in不对NULL进行处理。

如果查询的两个表大小相当,那么用in和exists差别不大。

in操作的原理是先进行子查询操作,再进行主查询操作;exist操作是先进行主查询操作再进行子查询操作。


可以看下面的例子,注意not in的检索是从外部查询逐条匹配子查询的检索出所有的元素。匹配相等就返回true,就会输出一条元素。而not exists就不是这个搜索原理了,他是看返回的元素个数如果针对not exists返回的元素为0则为真,所以会保留Null值。

可以看下以下的例子:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值