`

NOT EXISTS替代NOT IN ,EXISTS替换DISTINCT

阅读更多

用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’);
用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核心模块将在子查询的条件一旦满足后,立刻返回结果。

识别‘低效执行’的SQL语句

  用下列SQL工具找出低效SQL:

  SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, 
  ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, 
  ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run, 
  SQL_TEXT 
  FROM V$SQLAREA 
  WHERE EXECUTIONS>0 
  AND BUFFER_GETS > 0 
  AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8 
  ORDER BY 4 DESC;

  (虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法)

转自:http://blog.csdn.net/zhuangzhineng/archive/2009/08/19/4463396.aspx

分享到:
评论

相关推荐

    exists SQL用法详解、exists和not exists的常用示例

    在SQL查询中,`EXISTS`和`NOT EXISTS`是两个非常...这两个操作符可以替代`IN`和`NOT IN`,在某些情况下提供更高的性能,尤其是在处理大量数据或复杂关联时。理解和熟练运用这些操作符,能够提高SQL查询的效率和灵活性。

    mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录

    MySQL中的`NOT IN`, `LEFT JOIN`, `IS NULL`, 和 `NOT EXISTS` 是四种不同的SQL查询方式,它们在特定情况下可以实现相似的功能,但实际执行效率可能会有很大差异。本文主要探讨这四种方法在处理大数据量时的性能表现...

    sql中exists的用法

    在 SQL 中,in 和 exists 的使用场景可以互换,但是在某些情况下,exists 的效率可能要高于 in。例如: ```sql SELECT ID, NAME FROM A WHERE ID IN (SELECT AID FROM B); ``` 这个查询将返回表 A 中所有与表 B 相...

    SQL中EXISTS与IN

    ### SQL中EXISTS与IN的区别及应用场景 #### EXISTS详解 **定义与原理** - **基本概念**:`EXISTS` 是 SQL 中的一个谓词,用于判断子查询是否有结果返回,而不是关心具体的返回值。它主要关注子查询是否至少有一行...

    Oracle SQL编写规范

    用NOT EXISTS替代NOT IN可以提高执行效率。 13. 用EXISTS替换DISTINCT,如: 在编写SQL语句时,用EXISTS替换DISTINCT可以提高执行效率。 14. 识别'低效执行'的SQL语句 在编写SQL语句时,识别'低效执行'的SQL语句...

    MySQL exists 和in 详解及区别

    MySQL中的`EXISTS`和`IN`都是在SQL查询中用来检查某条记录是否符合特定条件的子查询操作符,但它们的工作原理和使用场景有所不同。 `EXISTS`子查询主要检查子查询是否能返回至少一行数据。在这个过程中,子查询的...

    Oracle SQL性能

    与使用EXISTS替代IN类似,使用NOT EXISTS代替NOT IN也可以提高查询效率。NOT EXISTS通常比NOT IN更高效,因为它只需要找到一个不存在的匹配项即可返回FALSE,而NOT IN则需要完全遍历整个列表。 #### 十一、用表连接...

    经常要用的DB2优化

    - **优化建议**:在查询中使用EXISTS替代IN、NOT EXISTS替代NOT IN可以提高查询效率,特别是涉及到多个表的联接查询时。 - **例子**: - **低效**: `SELECT * FROM EMP WHERE EMPNO &gt; 0 AND DEPTNO IN (SELECT ...

    SQL性能调优

    最后,需要注意常用关键字优先级,使用EXISTS替代IN,使用NOT EXISTS替代NOT IN,使用表连接替换EXISTS,使用 EXISTS替换DISTINCT,避免在索引列上使用IS NULL和IS NOT NULL等。 SQL性能调优是一项非常重要的技术,...

    OracleSql脚本书写规范

    用NOT EXISTS替代NOT IN** 类似地,对于否定条件,NOT EXISTS也通常优于NOT IN,尤其是在存在NULL值时。 **11. 用表连接替换EXISTS** 某些情况下,用JOIN代替EXISTS可以简化查询并提高性能,特别是当JOIN条件与...

    数据库SQL查询语句练习题.docx

    SELECT DISTINCT Sno FROM SC AS X WHERE NOT EXISTS ( SELECT * FROM SC AS Y WHERE Y.Sno='S3' AND NOT EXISTS ( SELECT * FROM SC AS Z WHERE Z.Sno=X.Sno AND Z.Cno=Y.Cno ) ); 此外,该资源摘要信息还包括...

    关于SQL的查询语句

    通过使用 `NOT EXISTS` 和 `IN` 等逻辑运算符结合子查询和聚合函数,该SQL查询能够有效地完成任务。此外,通过 `GROUP BY` 和 `HAVING` 子句进一步确保了查询结果的准确性和精确度。这种查询方式在处理复杂的关系型...

    Oracle+SQL大全解析

    用UNION替代OR,用IN替换OR,以及用EXISTS替换DISTINCT都是常见的优化手段。使用索引时,还要注意索引的创建、管理和操作,如何在不改变索引列类型的前提下优化性能。在优化GROUP BY时,可以考虑使用并行查询和哈希...

    Oracle语句规划详解

    用NOT EXISTS替代NOT IN - **规则描述**:与第18条规则类似,但针对否定情况。使用NOT EXISTS代替NOT IN可以提高效率。 - **示例**:查询没有订单的客户信息: - 低效:`SELECT * FROM CUSTOMER WHERE CUST_ID NOT...

    sql优化技巧

    类似地,使用NOT EXISTS替代NOT IN也可以提高性能。NOT EXISTS在找到第一个不匹配项后即可停止搜索,而NOT IN需要遍历整个子查询结果。 **11. 用表连接替换EXISTS** 当涉及到多个表的查询时,使用表连接代替EXISTS...

    DB2_SQL优化.doc

    * 合理使用 Not in 和 Not Exists:可以使用索引来加速 Not in 和 Not Exists 语句的执行。 * 防止使用 distinct:可以使用 Group By 语句来替换 distinct 语句。 * 不兼容的数据类型:可以使用 Cast 语句来转换数据...

    ORACLE SQL性能調整

    18. **用NOT EXISTS替代NOT IN**:同样,NOT EXISTS通常优于NOT IN,因为NOT EXISTS停止在找到第一个匹配项时。 19. **用表连接替换EXISTS**:某些情况下,JOIN操作比EXISTS更有效率。 20. **用EXISTS替代DISTINCT...

    SQL编写规范

    #### 三、规范二:用EXISTS替代IN、用NOT EXISTS替代NOT IN 在某些查询场景中,为了判断某条记录是否存在于另一张表中,经常会使用 `IN` 或 `NOT IN`。然而,这两种方式在性能上可能不如使用 `EXISTS` 或 `NOT ...

Global site tag (gtag.js) - Google Analytics