Eyifan专栏

在此写出自己在工作、情感中的心声!

蔡虹ID:aiunong
81496次访问,排名1164(-1)好友11人,关注者21
致力在ERP领域发展,目标成为 供应链专家、顾问。欢迎志同道合的朋友与我联系。
aiunong的文章
原创 28 篇
翻译 0 篇
转载 48 篇
评论 111 篇
蔡虹的公告
欢迎光临,希望大家积极参与进来,共同探讨技术上的问题,当然也欢迎大家讲出自己的动人故事!
联系方式:QQ:82232942


最近评论
younixianzai:现在人才可真多啊~~一出来看才知道自己知道的这么少
maliangdonet:不是很懂。没有实际操作过。、
Neetgo:楼主,对不起。网速慢,没想到一下子提交了那么多,我不是有意的。对不起。
Neetgo:仔细想想,自己有很多不满足。要加油哦。

I need to go!
Neetgo:仔细想想,自己有很多不满足。要加油哦。

I need to go!
文章分类
收藏
    相册
    个人专集
    其它
    山海关燕塞湖之旅
    理财资讯
    和讯
    第一理财网
    友情联接
    CSDN葛涵涛专栏
    DPR
    Drate的随笔
    EagleZhang
    股市叶弘BLOG
    知识性网站
    PD11 中文教程
    UMLchina论坛
    UML软件工程组织
    企业方案与案例ERP
    永联软件工程UML
    软件工程专家网
    软件研发之窗(RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 IN&EXISTS与NOT IN&NOT EXISTS 的优化原则的讨论(Z)收藏

    新一篇: ORACLE中 大数据表的交叉数据集的查询 SQL优化方法 | 旧一篇: 原创:Oracle数据库中查询数据表中的前N名、后N名、中间N名记录的方法

    1.
    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 和 exists的性能区别:
       如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
       其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了
                               
    另外IN时不对NULL进行处理
    如:
    select 1 from dual where null  in (0,1,2,null)
    为空
    2.NOT IN 与NOT EXISTS:       
    NOT EXISTS的执行流程
    select .....
      from rollup R
    where not exists ( select 'Found' from title T
                                 where R.source_id = T.Title_ID);
    可以理解为:
    for x in ( select * from rollup )
          loop
              if ( not exists ( that query ) ) then
                     OUTPUT
              end if;
           end;

    注意:NOT EXISTS 与 NOT IN 不能完全互相替换,看具体的需求。如果选择的列可以为空,则不能被替换。

    例如下面语句,看他们的区别:
    select x,y from t;
    x              y
    ------         ------
    1              3
    3        1
    1        2
    1        1
    3        1
    5
    select * from t where  x not in (select y from t t2  )
    no rows
           
    select * from t where  not exists (select null from t t2
                                                      where t2.y=t.x )
    x       y
    ------  ------
    5       NULL
    所以要具体需求来决定

    对于not in 和 not exists的性能区别:
       not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hash join.
       如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null
    NOT IN 在基于成本的应用中较好

    比如:
    select .....
    from rollup R
    where not exists ( select 'Found' from title T
                               where R.source_id = T.Title_ID);

    改成(佳)

    select ......
    from title T, rollup R
    where R.source_id = T.Title_id(+)
        and T.Title_id is null;
                                     
    或者(佳)
    sql> select /*+ HASH_AJ */ ...
            from rollup R
            where ource_id NOT IN ( select ource_id
                                                   from title T
                                                  where ource_id IS NOT NULL )

    注意:上面只是从理论上提出了一些建议,最好的原则是大家在上面的基础上,能够使用执行计划来分析,得出最佳的语句的写法
    希望大家提出异议

    发表于 @ 2006年02月22日 18:06:00|评论(loading...)|编辑

    新一篇: ORACLE中 大数据表的交叉数据集的查询 SQL优化方法 | 旧一篇: 原创:Oracle数据库中查询数据表中的前N名、后N名、中间N名记录的方法

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 蔡虹