Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

db2之in和exist的性能区别

Posted on 2019-01-10 11:38 Prayer 阅读(2007) 评论(0)  编辑 收藏 引用 所属分类: DB2
https://blog.csdn.net/zhan19861022/article/details/7697652
一、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  loop 

二、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。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理