Chinaunix首页 | 论坛 | 博客
  • 博客访问: 13137
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 9
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-14 21:40
文章分类

全部博文(8)

文章存档

2013年(8)

我的朋友

分类: DB2/Informix

2013-05-14 22:20:28

一、IN 和EXISTS的性能区别
        in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。 
其实区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了。

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  

oop  



二、not in 和 not exists的性能区别: 
         not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hash join. 
        如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists。如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in要快。

       总结not exists >> not in,in与exists的使用取决于子查询集合大小IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况,即如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
阅读(1009) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~