`

Oracle 中的 exists 和 in

阅读更多

 

文章出自 : http://huangdonghongwan.blog.163.com/blog/static/32554356201002434149333/

 

 

1.用EXISTS替代IN
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.

 

低效:

SELECT *
  FROM EMP --(基础表)
 WHERE EMPNO > 0
   AND DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC = 'MELB') ;

 

高效:

SELECT *
  FROM EMP --(基础表)
 WHERE EMPNO > 0
   AND EXISTS (SELECT 'X'
          FROM DEPT
         WHERE DEPT.DEPTNO = EMP.DEPTNO
           AND LOC = 'MELB') ;

 

  (相对来说,用NOT EXISTS替换NOT IN 将更显著地提高效率)

 

2. 用NOT EXISTS替代NOT IN
在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历).  为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.

例如:

SELECT *
  FROM EMP
 WHERE DEPT_NO NOT IN (SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT = 'A');

 

为了提高效率.改写为:

(方法一: 高效)

SELECT *
  FROM EMP A, DEPT B
 WHERE A.DEPT_NO = B.DEPT(+)
   AND B.DEPT_NO IS NULL
   AND B.DEPT_CAT(+) = 'A';

(方法二: 最高效)

SELECT *
  FROM EMP E
 WHERE NOT EXISTS (SELECT 'X'
          FROM DEPT D
         WHERE D.DEPT_NO = E.DEPT_NO
           AND DEPT_CAT = 'A');

 

本人在使用中发现左外连接性能比not exist更高效,请大家进一步验证。

 

 

3.用表连接替换EXISTS
      通常来说 , 采用表连接的方式比EXISTS更有效率

SELECT ENAME
  FROM EMP E
 WHERE EXISTS (SELECT 'X'
          FROM DEPT
         WHERE DEPT_NO = E.DEPT_NO
           AND DEPT_CAT = 'A');

--(更高效) 
SELECT ENAME
  FROM DEPT D, EMP E
 WHERE E.DEPT_NO = D.DEPT_NO
   AND DEPT_CAT = 'A';
--(在RBO的情况下,前者的执行路径包括FILTER,后者使用NESTED LOOP)

 

4.用EXISTS替换DISTINCT
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换
例如:

--低效: 
SELECT DISTINCT DEPT_NO, DEPT_NAME
  FROM DEPT D, EMP E
 WHERE D.DEPT_NO = E.DEPT_NO;
--高效: 
SELECT DEPT_NO, DEPT_NAME
  FROM DEPT D
 WHERE EXISTS (SELECT 'X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
--  EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.

 

 

 

 

 

 

 

分享到:
评论

相关推荐

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

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

    简述Oracle中in和exists的不同

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

    oracle数据库关于exists使用

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

    in和exists的区别

    在Oracle数据库中,"IN"和"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语句优化.docx

    本文将详细地介绍 Oracle 语句优化的方法和技巧,涵盖多表关联、EXISTS 和 IN 语句的使用、INDEX_JOIN 优化、WHERE 和 HAVING 语句的区别、NOT IN 和 <> 操作符的使用、LIKE 操作符的替代、UNION 操作符的优化、SQL ...

    Sql语法转换为Oracle语法

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

    Oracle和MySQL语句区别.doc

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

    Oracle中常用的通配符

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

    oracle性能优化技巧

    - 在子查询中,使用`EXISTS`通常比`IN`更高效,因为`EXISTS`可以在找到第一个匹配项后立即停止搜索。 12. **NOT EXISTS与NOT IN的比较**: - `NOT IN`可能导致全表扫描,而`NOT EXISTS`则不会,因此在大多数情况...

Global site tag (gtag.js) - Google Analytics