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 )

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

转载于:https://www.cnblogs.com/yf520gn/archive/2009/01/12/1374359.html

ORACLE 中IN和EXISTS比较相关推荐

  1. oracle中sql函数exists,sql的exits函数

    oracle的exits函数 select t.fene from fenebiao t where t.code = '001' and date = to_date('2017-07-17', ' ...

  2. oracle中in与exists,Oracle中in和exists的区别

    项目中对数据库的查询操作很多,各种拼接,各种in,但由于in的内容受字符限制,所以有些地方将in改成了Extist,两种写法有什么关联,查了写资料,分析看看: in和exists in 是把外表和内表 ...

  3. oracle有没有mysql if_Oracle中没有 if exists(...)

    对于Oracle中没有 if exists(...) 的语法,目前有许多种解决方法,这里先分析常用的三种,推荐使用最后一种 第一种是最常用的,判断count(*)的是否为零,如下 declare v_ ...

  4. oracle中sql语句的优化(转帖)

    一.执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边 表或视图: Student_info   (30000条数据) Description_inf ...

  5. oracle百分比变成小数,oracle中计算百分比,并同时解决小数点前0不显示的问题...

    select a.catalog_name,decode(substr(trunc((a.s/b.count2),4)*100||'%',0,1),'.',replace(trunc((a.s/b.c ...

  6. oracle中sql语句的优化

    2019独角兽企业重金招聘Python工程师标准>>> 一.执行顺序及优化细则 1.表名顺序优化  (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边 表或视图:  St ...

  7. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  8. Oracle中的 IN, NOT IN和 EXISTS, NOT EXISTS的區別

    Oracle中的 IN, NOT IN和 EXISTS, NOT EXISTS的區別 通常聽到的都是說盡量用exists不要用in,因為exists只判斷存在而in需要對比值,所以exists比較快, ...

  9. oracle中exist什么意思,oracle中not exists 是什么意思 , oracle数据库中exists的作用

    导航:网站首页 > oracle中not exists 是什么意思 , oracle数据库中exists的作用 oracle中not exists 是什么意思 , oracle数据库中exist ...

最新文章

  1. 工信部王卫明:我国5G研发开局良好
  2. B. 熟练剖分(tree) (概率DP)
  3. Java实现复数Complex的加减乘除运算、取模、求幅角角度
  4. SCCM 2012远程控制
  5. 乐视网1354项商标1.3亿元成交,接盘的是这家公司
  6. python2升级_Python2 升级 Python3
  7. python selenium框架搭建_python + selenium 自动化框架搭建
  8. Unity中内嵌网页插件 UniWebView 2.8使用
  9. EasyRecovery15版本电脑数据恢复软件
  10. 8.声卡驱动05-自己实现alsa驱动-虚拟声卡-kcontrol
  11. 平面设计之PS(前)
  12. 手把手教你做出数据可视化项目(三)3D地球旋转
  13. Windows​服务器添加单IP不同段IP和整段IP
  14. 代码可读性为什么重要啊....人家读不出来不是更安全吗?
  15. python 城市身份证代号
  16. 第二章 z变换之四 、序列的z变换与连续时间信号的Laplace变换、Fourier变换的关系
  17. E/KING_CARD: WebSettingsExtension getQProxyEnabled false
  18. VisionMobile:“只为粉丝”或者小米并非你所想的那样
  19. 算法书籍推荐及网络资源
  20. 交换control和command按键

热门文章

  1. GDAL源码剖析(一)
  2. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress
  3. 【java学习之路】(java SE篇)002.java SE基础语法
  4. html弹幕效果加入视频,JS实现的视频弹幕效果示例
  5. php global没用,global php 不起作用怎么办
  6. linux 修改jdk版本 /usr/src/jdk-11.0.11/bin/java: 无法执行二进制文件
  7. springboot集成mybati 后又使用mybatisPlus 出现的问题 BindingException:Invalid bound statement
  8. CentOs7配置java环境
  9. HIve map jion的原理、操作和使用场景
  10. Linux 下 WildFly (原Jboss) 的安装 、配置以及发布