`

ORACLE 中IN和EXISTS比较

    博客分类:
  • sql
阅读更多

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 )

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

分享到:
评论

相关推荐

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

    Oracle 中 EXISTS 和 IN 的效率问题详解 EXISTS 和 IN 都是 Oracle 中的集合操作符,但它们在使用和执行效率上有所不同。本文将深入探讨 EXISTS 和 IN 的使用场景、执行机制和效率问题。 EXISTS 的使用场景和机制 ...

    in和exists的区别

    在Oracle数据库中,"IN"和"EXISTS"都是用于查询某个集合的元素是否存在于另一个集合中的关键字。然而,它们在处理数据时的效率和适用场景有所不同,这主要取决于涉及的数据量以及表之间的关联。 首先,让我们来看看...

    简述Oracle中in和exists的不同

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

    oracle数据库关于exists使用

    ### Oracle数据库中Exists与In的使用详解 #### 一、Exists 的使用方法 在Oracle数据库中,`EXISTS` 是一种常用的子查询操作符,用于判断子查询是否有结果返回。如果子查询至少返回一行数据,则 `EXISTS` 表达式的...

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

    IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,用于判断某个值是否存在于一个列表中。其基本语法...

    in和exists性能解析

    在数据库查询语言中,`IN` 和 `EXISTS` 子句是两种常见的用于关联两个表的方法,它们各自有其独特的性能特点和适用场景。本文将深入解析Oracle中`IN`与`EXISTS`的性能差异,以及如何根据具体需求选择最合适的查询...

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

    在Oracle数据库中,`IN`、`EXISTS`、`NOT IN` 和 `NOT EXISTS` 是四个常用的子查询操作符,它们在SQL查询语句中扮演着不同的角色,且各有其性能特点。以下是对这些操作符的详细分析和比较。 1. `IN` 操作符: `IN` ...

    Oracle: minus | in | exists

    在Oracle数据库中,`MINUS`、`IN` 和 `EXISTS` 是三种不同的SQL查询操作符,它们各自用于特定的数据处理场景。了解并熟练掌握这些操作符对于优化查询性能和编写复杂的SQL语句至关重要。 1. **MINUS 操作符** `MINUS...

    “exists”和“in”的效率问题

    在数据库查询语言SQL中,“Exists”与“In”是两种常用的子查询方法,它们在实际应用中各有优势与局限。本文将深入探讨这两种方法的工作原理、应用场景以及性能差异,帮助读者更好地理解和选择合适的查询方式。 ###...

    oracle中not exists对外层查询的影响详解

    在Oracle数据库中,`NOT EXISTS` 子句常用于查询中,以排除某些特定条件的记录。然而,它对查询性能的影响可能并不总是直观的,尤其是在涉及到外层查询时。本文将深入探讨`NOT EXISTS`如何影响外层查询,并通过示例...

    Oracle常用关键词和函数

    在本文中,我们将深入探讨一些Oracle中常用的关键词和函数。 首先,我们来看NVL()函数,这是一个非常实用的处理空值(NULL)的函数。NVL(a, b)的作用是如果表达式a的值为NULL,则返回b的值,否则返回a的值。这在...

    Oracle PL SQL 开发人员试题(DBA)

    Oracle PL/SQL 开发人员试题...本资源涵盖了 Oracle PL/SQL 中的多个重要概念和语句,包括子查询、NOT IN 语句、EXISTS 语句、IN 语句和 ROWNUM 语句等。这些概念和语句是 Oracle PL/SQL 开发人员必须掌握的基本技能。

    Oracle详细教程.doc Oracle详细教程.doc

    EXISTS 子查询检查是否存在满足条件的记录,IN 子查询检查是否在子查询结果中,NOT IN 子查询检查是否不在子查询结果中。 高级查询 高级查询是 Oracle 中的一种查询方式,用于实现复杂的数据检索。常用的高级查询...

    Oracle和MySQL语句区别.doc

    例如,在Oracle中,可以使用IN、EXISTS、NOT EXISTS等关键字来实现Subquery,而在MySQL中,则使用IN、EXISTS等关键字。 索引 索引是数据库性能优化的重要手段。Oracle和MySQL都支持创建索引,但是它们在创建索引时...

    Sql语法转换为Oracle语法

    3. 子查询:SQL Server使用 `IN (SELECT ...)`,Oracle则更倾向于 `EXISTS (SELECT 1 FROM ...)`。 4. 分页查询:SQL Server 使用 `OFFSET ... ROWS FETCH NEXT ... ROWS ONLY`,Oracle则使用 `ROWNUM` 和子查询来...

    Oracle中常用的通配符

    通过本文,我们将详细介绍Oracle中常见的通配符及其用法,帮助读者更好地理解和运用这些符号,从而提高SQL查询的灵活性和效率。 #### 一、通配符概述 在Oracle SQL中,通配符主要用于`LIKE`操作符中,用于模糊查询...

    一次SQL Tuning引出来的not in , not exists 语句的N种写法2

    【描述】:文章并未直接提供描述,但从标题推测,该内容可能涉及数据库查询优化,特别是关于`not in`和`not exists`两种SQL查询子句的不同使用方式和性能比较。 【标签】:SQL优化,查询性能,数据库管理 【正文】...

    Oracle数据库编程调优手册

    其他优化提示中,IN和EXISTS子查询的使用是个常见话题。通常,当比较单个值时,EXISTS通常比IN更高效,因为它只需要检查是否存在匹配的记录,而不需要返回实际的值。反之,如果IN中的列表较小,且不需要额外的行检查...

Global site tag (gtag.js) - Google Analytics