`
shuiguozheng
  • 浏览: 2091 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

ORACLE 中IN和EXISTS比较

阅读更多

ORACLE 中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 和 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 )

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

  本文章转载于:http://www.cnblogs.com/yf520gn/archive/2009/01/12/1374359.html

分享到:
评论

相关推荐

    oracle中exists_和in的效率问题详解

    oracle中exists_和in的效率问题详解

    简述Oracle中in和exists的不同

    且看接下来的具体分析:in其实是将外表和内表进行hash join,exists是先对外表进行loop操作,然后每次loop后再对内表进行查询。 如果两张表大小差不多,那么exists和in的效率差不多。 例如: 一张大表为A,一张小表B...

    in和exists的区别

    “exists”和“in”是Oracle中,都是查询某集合的值是否存在在另一个集合,但对不同的数据有不同的用法,主要是在效率问题上存在很大的差别,以下有两个简单例子,以说明 “exists”和“in”的效率问题。

    in和exists性能解析

    oracle in和exists性能解析

    oracle数据库关于exists使用

    oracle数据库关于exists使用方法与in的比较

    sql in,exists,not in,not exists区别

    里面自己根据网上的资源整理出来的一份sql中in,exists,not in,not exists的使用方法以及注意事项等,有助于初学的朋友们借鉴。

    Oracle In和exists not in和not exists的比较分析

    一个是问in exist的区别,一个是not in和not exists的区别

    Oracle: minus | in | exists

    NULL 博文链接:https://wuaner.iteye.com/blog/1671927

    oracle advanced sql 高级SQL教程 ORACLE官方教材

    Using a Subquery in the FROM Clause 4-10 Scalar Subquery Expressions 4-11 Scalar Subqueries: Examples 4-12 Correlated Subqueries 4-14 Using Correlated Subqueries 4-16 Using the EXISTS Operator 4-18 ...

    Oracle内部培训汇总

    oracle进阶教程 1、优化器 2、连接 3、in和exists 4、hint 5、index 6、收集统计信息 7、优化技巧

    Oracle数据库、SQL

    12.7 in和exists比较 22 十三、 多表查询 23 13.1按范式要求设计表结构 23 13.2多表连接的种类 23 13.3交叉连接 23 13.4内连接 23 13.5外连接 25 13.6非等值连接 27 13.7表连接总结 27 十四、 集合 28 14.1表连接...

    oracle管理及优化文档 粗略整理

    尽量用not exists 或者外连接替代 not in 操作符。因为not in不能 应用表的索引 3。尽量不用<> 或者!= 操作符。不等于操作符是永远不会用到索引的,因此 对它的处理只会产生全表扫描,改为 a> XX or a 4.在设计...

    Oracle数据库SQL语句优化策略

    基本的Sql编写注意事项 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替 用IN写出来的SQL的优点是比较容易写及清晰易懂,但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的...

    oracle的sql优化

     对Oracle共享池和缓冲区中的Sql必须要大小写都完全用上才能够匹配上 2.顺序问题  Oracle按照从右到左的顺序对数据表进行解析。因此From最后面的表为基础表,一般要选择记录数最少的表作为基础表。  对于Where...

    Oracle数据库Sql性能调优

    1.27 等式比较和范围比较 17 1.28 不明确的索引等级 17 1.29 强制索引失效 18 1.30 避免在索引列上使用计算 19 1.31 自动选择索引 20 1.32 避免在索引列上使用NOT 20 1.33 用>=替代> 21 1.34 用UNION替换OR (适用于...

    Oracle_Database_11g完全参考手册.part3/3

    《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句,如何使用大对象和对象,...

    Oracle_Database_11g完全参考手册.part2/3

    《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句,如何使用大对象和对象,...

    oracle学习日志总结

    尽量使用“>=”,不要使用“>”,用EXISTS代替IN(外表数据小情况),用大于或小于代替不等于,用右模糊查询(LIKE ‘…%’)代替模糊查询,用UNION ALL代替UNION,union代替or,trancate代替delete等. 7. count(1)比...

Global site tag (gtag.js) - Google Analytics