`
liufeng_king
  • 浏览: 35582 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

ORACLE中NOT IN 的替代

阅读更多

典型的查询方式为:
SELECT TITLE
FROM BOOKSHELF
WHERE TITLE NOT IN
      (SELECT TITLE FROM BOOKSHELF_CHECKOUT)
ORDER BY TITLE;
如果BOOKSHELF_CHECKOUT很大的话,速度可能会很慢,因为ORACLE会在BOOKSHELF_CHECKOUT上执行一个时间密集型的全表扫描。

oracle 中not in 效率不高

一:
使用外部连接 
SELECT DISTINCT C.TITLE
FROM BOOKSHELF_CHECKOUT B RIGHT OUTER JOIN BOOKSHELF C
    ON B.TITLE = C.TITLE
WHERE B.TITLE IS NULL
ORDER BY C.TITLE ;
优化后的程序可以使用连接列上的索引。
WHERE B.TITLE IS NULL 
表示不出现在BOOKSHELF_CHECKOUT中的TITLE列 (ORACLE作为NULL列返回,可参考外部连接方面的内容)
二:
使用NOT EXISTS 
SELECT B.TITLE 
FROM BOOKSHELF B
WHERE NOT EXISTS
     (SELECT 'X' FROM BOOKSHELF_CHECKOUT C
      WHERE C.TITLE = B.TITLE)
ORDER BY B.TITLE
对于BOOKSHELF中每一个记录和BOOKSHELF_CHECKOUT匹配则是EXISTS.NOT EXISTS则是不存在的。 
NOT EXISTS往往可以使用可利用的索引,NOT IN 可能无法使用这些索引。

 

exists (sql 返回结果集为真) 
not exists (sql 不返回结果集为真) 
如下: 
表A 
ID NAME 
1    A1 
2    A2 
3  A3

表B 
ID AID NAME 
1    1 B1 
2    2 B2 
3    2 B3

表A和表B是1对多的关系 A.ID => B.AID

SELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID) 
执行结果为 
1 A1 
2 A2 
原因可以按照如下分析 
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1) 
--->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2) 
--->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3) 
--->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据

NOT EXISTS 就是反过来 
SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID) 
执行结果为 
3 A3 
=========================================================================== 
EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因 
SELECT ID,NAME FROM A  WHERE ID IN (SELECT AID FROM B)

NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别 
SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)

分享到:
评论

相关推荐

    Oracle SQL编写规范

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

    oracle企业面试题集锦.pdf

    逻辑优化包括对表进行逻辑分割、使用占位符语句、将耗时的操作通过存储过程等在用户较少的情况下执行、尽量不使用 * 号、选择有效的表名、Where 字句规则、使用 Exits Not Exits 替代 In Not in、合理使用事务、合理...

    Oracle 常用SQL技巧经典收藏

    8. **用NOT EXISTS替换NOT IN**:在否定子查询中,NOT EXISTS通常比NOT IN快,因为NOT EXISTS只需检查是否存在匹配项,而NOT IN可能需要遍历整个子查询结果。 这些技巧可以帮助数据库管理员和开发人员优化Oracle ...

    oracle 创建wm_concat函数

    在Oracle 10G及更早版本中,并没有内置的`wm_concat`函数,该函数主要用于对一组字符串进行连接操作。为了在这些版本中实现类似的功能,需要自行创建一个用户定义的聚合函数。下面将详细介绍如何创建这样一个函数。 ...

    oracle语句优化.docx

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

    Oracle性能问题总结

    * 用 NOT EXISTS 替代 NOT IN * 通常情况下,采用表连接的方式比 exists 更有效率 * 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在 SELECT 子句中使用 DISTINCT * 使用>=替代〉,这样 DBMS 可...

    Oracle——sql语句优化

    Oracle数据库在处理NOT IN查询时,往往需要遍历整个表,这无疑增加了查询的时间复杂度。 **推荐方案**:采用NOT EXISTS或外连接结合空值判断的策略,既可确保索引的利用,又能提高查询速度。 #### 操作符(不等于...

    oracle-use.rar_Oracle drop use_oracle

    "SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别"是SQL查询的基础。`IN`用于判断某值是否在给定的集合中,`NOT IN`则相反。`EXISTS`和`NOT EXISTS`则更注重子查询的存在与否,而非具体值的比较。例如,`SELECT * ...

    Oracle语句规划详解

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

    oracle操作文档

    在数据库系统中,尤其是在大型企业级应用中,Oracle 数据库因其稳定性和强大的功能被广泛使用。然而,随着数据量的增长和业务复杂性的增加,如何有效地优化 Oracle 查询成为了一个重要的课题。本文将详细探讨 Oracle...

    oracle查询语句优化

    Oracle数据库因其强大的功能和灵活性,在企业级应用中占据着重要地位。随着业务的发展,数据库的数据量急剧增长,如何提高查询效率成为了亟需解决的问题之一。本文将从Oracle SQL语句优化的角度出发,详细探讨几种...

    OracleSql脚本书写规范

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

    Oracle数据库SQL优化总结

    14. **使用EXISTS替换IN,用NOT EXISTS替换NOT IN**:EXISTS和NOT EXISTS通常比IN和NOT IN更高效,尤其是在涉及子查询时。 15. **识别低效SQL语句**:监控和分析SQL执行计划,找出执行时间长、资源消耗大的语句进行...

    oracle+plsql性能优化

    例如,在where子句中避免使用isnull或isnotnull,因为这会阻止索引的使用。另外,对于联接列,即使联接值为静态值,优化器同样可能不会使用索引,这要求开发者在编写查询时需要考虑到优化器的工作方式。 2. SQL语句...

    oracle sql调优原则

    - **IN/NOT IN操作符优化**:在业务密集的SQL中尽量避免使用`IN`和`NOT IN`操作符,可以使用`EXISTS`或`NOT EXISTS`来代替,以提高性能。同时,如果使用`IN`操作符,应将出现频率最高的值放在列表的前面。 - **IS ...

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

    - 使用`NOT EXISTS`来替代`NOT IN`。 - 考虑使用左外连接(LEFT OUTER JOIN)来优化查询逻辑。 ##### 3. 避免使用不等号(<> 或 !=) - **原因分析**:这些符号不会利用索引进行查询,从而增加查询时间。 - **...

    Oracle性能优化的基本准则总结

    6. **避免NOT IN**:NOT IN操作符无法利用索引,会导致全表扫描,应尽量使用Exists或Not Exists,或者通过外连接结合空值判断来替代。 7. **不等于操作符()**:不等于操作符不会使用索引,可能导致全表扫描。可以...

    提高Oracle数据库查询效率

    使用 EXISTS 替代 IN 在进行子查询时,使用`EXISTS`代替`IN`往往能获得更好的性能。这是因为`EXISTS`只需要判断子查询是否有结果返回即可,而`IN`则需要返回所有的结果值。例如,假设我们要查询所有属于某个部门的...

    Oracle 开发DBA SQL编写规范

    - 使用`not exists`来替代`not in`,以提高查询效率。 - 示例: ```sql -- 错误示例 select * from tab1 where id not in (select id from tab2); -- 正确示例 select * from tab1 t1 where not exists ...

    Oracle高效SQL语句原则.txt

    - **建议**:使用`IS NULL`或`IS NOT NULL`来替代`NULL`值的比较,以提高查询效率。 3. **使用常量值代替变量值**: - 当WHERE子句中的条件包含常量值时,Oracle可以更有效地利用索引来加速查询。 - **建议**:...

Global site tag (gtag.js) - Google Analytics