典型的查询方式为:
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)
分享到:
相关推荐
用NOT EXISTS替代NOT IN可以提高执行效率。 13. 用EXISTS替换DISTINCT,如: 在编写SQL语句时,用EXISTS替换DISTINCT可以提高执行效率。 14. 识别'低效执行'的SQL语句 在编写SQL语句时,识别'低效执行'的SQL语句...
逻辑优化包括对表进行逻辑分割、使用占位符语句、将耗时的操作通过存储过程等在用户较少的情况下执行、尽量不使用 * 号、选择有效的表名、Where 字句规则、使用 Exits Not Exits 替代 In Not in、合理使用事务、合理...
8. **用NOT EXISTS替换NOT IN**:在否定子查询中,NOT EXISTS通常比NOT IN快,因为NOT EXISTS只需检查是否存在匹配项,而NOT IN可能需要遍历整个子查询结果。 这些技巧可以帮助数据库管理员和开发人员优化Oracle ...
在Oracle 10G及更早版本中,并没有内置的`wm_concat`函数,该函数主要用于对一组字符串进行连接操作。为了在这些版本中实现类似的功能,需要自行创建一个用户定义的聚合函数。下面将详细介绍如何创建这样一个函数。 ...
本文将详细地介绍 Oracle 语句优化的方法和技巧,涵盖多表关联、EXISTS 和 IN 语句的使用、INDEX_JOIN 优化、WHERE 和 HAVING 语句的区别、NOT IN 和 <> 操作符的使用、LIKE 操作符的替代、UNION 操作符的优化、SQL ...
* 用 NOT EXISTS 替代 NOT IN * 通常情况下,采用表连接的方式比 exists 更有效率 * 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在 SELECT 子句中使用 DISTINCT * 使用>=替代〉,这样 DBMS 可...
Oracle数据库在处理NOT IN查询时,往往需要遍历整个表,这无疑增加了查询的时间复杂度。 **推荐方案**:采用NOT EXISTS或外连接结合空值判断的策略,既可确保索引的利用,又能提高查询速度。 #### 操作符(不等于...
"SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别"是SQL查询的基础。`IN`用于判断某值是否在给定的集合中,`NOT IN`则相反。`EXISTS`和`NOT EXISTS`则更注重子查询的存在与否,而非具体值的比较。例如,`SELECT * ...
用NOT EXISTS替代NOT IN - **规则描述**:与第18条规则类似,但针对否定情况。使用NOT EXISTS代替NOT IN可以提高效率。 - **示例**:查询没有订单的客户信息: - 低效:`SELECT * FROM CUSTOMER WHERE CUST_ID NOT...
在数据库系统中,尤其是在大型企业级应用中,Oracle 数据库因其稳定性和强大的功能被广泛使用。然而,随着数据量的增长和业务复杂性的增加,如何有效地优化 Oracle 查询成为了一个重要的课题。本文将详细探讨 Oracle...
Oracle数据库因其强大的功能和灵活性,在企业级应用中占据着重要地位。随着业务的发展,数据库的数据量急剧增长,如何提高查询效率成为了亟需解决的问题之一。本文将从Oracle SQL语句优化的角度出发,详细探讨几种...
用NOT EXISTS替代NOT IN** 类似地,对于否定条件,NOT EXISTS也通常优于NOT IN,尤其是在存在NULL值时。 **11. 用表连接替换EXISTS** 某些情况下,用JOIN代替EXISTS可以简化查询并提高性能,特别是当JOIN条件与...
14. **使用EXISTS替换IN,用NOT EXISTS替换NOT IN**:EXISTS和NOT EXISTS通常比IN和NOT IN更高效,尤其是在涉及子查询时。 15. **识别低效SQL语句**:监控和分析SQL执行计划,找出执行时间长、资源消耗大的语句进行...
例如,在where子句中避免使用isnull或isnotnull,因为这会阻止索引的使用。另外,对于联接列,即使联接值为静态值,优化器同样可能不会使用索引,这要求开发者在编写查询时需要考虑到优化器的工作方式。 2. SQL语句...
- **IN/NOT IN操作符优化**:在业务密集的SQL中尽量避免使用`IN`和`NOT IN`操作符,可以使用`EXISTS`或`NOT EXISTS`来代替,以提高性能。同时,如果使用`IN`操作符,应将出现频率最高的值放在列表的前面。 - **IS ...
- 使用`NOT EXISTS`来替代`NOT IN`。 - 考虑使用左外连接(LEFT OUTER JOIN)来优化查询逻辑。 ##### 3. 避免使用不等号(<> 或 !=) - **原因分析**:这些符号不会利用索引进行查询,从而增加查询时间。 - **...
6. **避免NOT IN**:NOT IN操作符无法利用索引,会导致全表扫描,应尽量使用Exists或Not Exists,或者通过外连接结合空值判断来替代。 7. **不等于操作符()**:不等于操作符不会使用索引,可能导致全表扫描。可以...
使用 EXISTS 替代 IN 在进行子查询时,使用`EXISTS`代替`IN`往往能获得更好的性能。这是因为`EXISTS`只需要判断子查询是否有结果返回即可,而`IN`则需要返回所有的结果值。例如,假设我们要查询所有属于某个部门的...
- 使用`not exists`来替代`not in`,以提高查询效率。 - 示例: ```sql -- 错误示例 select * from tab1 where id not in (select id from tab2); -- 正确示例 select * from tab1 t1 where not exists ...
- **建议**:使用`IS NULL`或`IS NOT NULL`来替代`NULL`值的比较,以提高查询效率。 3. **使用常量值代替变量值**: - 当WHERE子句中的条件包含常量值时,Oracle可以更有效地利用索引来加速查询。 - **建议**:...