网上相关信息很多很多,到底not in 与 not exists谁的效率高,说实话,我也不知道!
select count(1) from ba_ry_jbxx a where not exists (select b.gmsfzh from ba_ry_zgkssh b where a.gmsfzh = b.gmsfzh);
select count(1) from ba_ry_jbxx a where a.gmsfzh not in (select b.gmsfzh from ba_ry_zgkssh b );
以下针对这两条语句分析:
说到比较,首先得有共同点才会去比较,共同点就是:都可以查询a表中的gmsfzh字段的值不在b表中的gmsfzh字段里的记录数。
前提条件是首先得保证这两个语句查询的数据的正确性,才可以进行效率的比较。
(1)当b表中的gmsfzh字段有空值时,用not in查询结果为0.所以这两个语句比较效率就没有任何意义了!就直接用not exists!
(2)当a表中的gmsfzh字段有空值时,查询结果固然也不一样,用 not exists 查询的记录数会大于用not in的记录数,因为 not exists把空值也
作为查询结果了,而not in不把空值作为结果。
(
至于为什么,我的理解是:因为not exists会关联a.gmsfzh = b.gmsfzh一下,除了关联上的数据其他的在a表中剩下的记录都认为不在b表中,因为空值肯定是关联不上的,
所以就认为空值不在b表中。
而为什么用not in时,a表中的空值就不算在查询结果内呢!因为oracle就这么规定的)
所以当a表中的gmsfzh字段有空值时,因为查询结果都不一样,你觉得哪个查询结果是正确的,固然就用哪个!
如果排除两个表的空值的问题,或者说a表中的空值并不影响查询结果的正确性时,接下来可以考虑not in 和not exists的执行效率问题了:
数据量情况:a表 100条记录, b表 70000条记录,执行以下两语句:
select count(1) from ba_ry_jbxx a where not exists (select b.gmsfzh from ba_ry_zgkssh b where a.gmsfzh = b.gmsfzh);
select count(1) from ba_ry_jbxx a where a.gmsfzh not in (select b.gmsfzh from ba_ry_zgkssh b );
当两个表都为gmsfzh字段建了索引的情况下
实测结果如下:
用not exists,耗时0.015秒。
用not in,耗时50.641秒。
这差距还真有点大。。。
毫无疑问,用not exists走索引了,而not in 并不走索引。
当删除两个表的索引之后:
实测结果如下:
用not exists,耗时50秒。
用not in,耗时 50.875秒,此时not exists和not in 几乎差不多。
数据量不变,反过来测试:
select count(1) from ba_ry_zgkssh b where not exists (select a.gmsfzh from ba_ry_jbxx a where b.gmsfzh = a.gmsfzh);
select count(1) from ba_ry_zgkssh b where b.gmsfzh not in (select a.gmsfzh from ba_ry_jbxx a );
无索引:
用not in,耗时 3.703秒.
用not exists,耗时3.641秒。(此时至少说明,无索引的情况下,b表数据量远远大于a表时,not in与not exists效率差不多)
建完索引后:
用not in,耗时 3.937秒.
用not exists,耗时0.813秒。
以上数据测试可见,索引的重要性。
我总觉得,not in既然存在,肯定有他存在的道理。
测试这么多,至少证明,有索引的情况下,多数时候not exists完虐not in的执行效率。
现在我纠结的问题就是,到底什么情况下not in效率要高于not exists? 还请高人留言指点一下。
分享到:
相关推荐
EXISTS 和 IN 都是 Oracle 中的集合操作符,但它们在使用和执行效率上有所不同。本文将深入探讨 EXISTS 和 IN 的使用场景、执行机制和效率问题。 EXISTS 的使用场景和机制 EXISTS 主要用于判断子查询是否存在记录...
IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,用于判断某个值是否存在于一个列表中。其基本语法...
在Oracle数据库中,`IN`、`EXISTS`、`NOT IN` 和 `NOT EXISTS` 是四个常用的子查询操作符,它们在SQL查询语句中扮演着不同的角色,且各有其性能特点。以下是对这些操作符的详细分析和比较。 1. `IN` 操作符: `IN` ...
而自动内存管理则简化了数据库管理员的工作,自动调整内存分配以适应工作负载,从而可能间接影响`not in`和`not exists`的执行效率。 在进行SQL优化时,除了选择合适的查询语法,还需要考虑数据库的配置和最新特性...
在10g中,这个查询的`buffer get`(缓冲区获取)较低,而在12c中较高,这表明了`NOT EXISTS`子句对外层查询性能的影响。 在10g中,由于`t2`中有`dep_id`为'mm'的记录,`NOT EXISTS`子句在匹配过程中可以更快地确定...
在Oracle数据库中,`MINUS`、`IN` 和 `EXISTS` 是三种不同的SQL查询操作符,它们各自用于特定的数据处理场景。了解并熟练掌握这些操作符对于优化查询性能和编写复杂的SQL语句至关重要。 1. **MINUS 操作符** `MINUS...
用NOT EXISTS替代NOT IN可以提高执行效率。 13. 用EXISTS替换DISTINCT,如: 在编写SQL语句时,用EXISTS替换DISTINCT可以提高执行效率。 14. 识别'低效执行'的SQL语句 在编写SQL语句时,识别'低效执行'的SQL语句...
使用 EXISTS、NOT EXISTS、IN、LEFT OUTER JOIN 等来代替 NOT 操作。 2. 注意 union 和 union all 的区别:union 比 union all 多做了一步 distinct 操作,能用 union all 的情况下尽量不用 union。 3. 查询时尽量...
在Oracle数据库中,`IN`和`EXISTS`都是用于子查询的比较操作符,但它们在执行方式和性能上存在显著差异。许多人误以为`EXISTS`总是比`IN`更快,但实际情况并非如此,具体表现取决于数据的分布和索引的利用。 1. **...
在Oracle数据库管理与优化领域,提高查询效率是至关重要的一个环节。这不仅能够显著提升应用程序的性能,还能减少数据库服务器的负载,从而为用户提供更流畅的服务体验。本文将结合提供的SQL示例,深入探讨如何通过...
在 where 条件中使用函数可能会导致 Oracle database 不能使用索引,降低 SQL 语句的执行效率。因此,应该尽量避免在 where 条件中对查询列使用函数,除非建立了相应的函数索引。 3. 任何在 where 子句中使用 is ...
**NOT IN与NOT EXISTS** 在WHERE子句中使用`NOT IN`或`NOT EXISTS`时,查询效率会受到显著影响。尽管`NOT IN`和`NOT EXISTS`在功能上相似,但它们的实现方式和性能差异很大。`NOT IN`在处理大型数据集时可能会导致...
- **规则描述**:通过调用Oracle内部函数可以提高SQL语句的执行效率。例如,使用内置函数进行日期计算或字符串处理通常比编写复杂的SQL逻辑更加高效。 - **示例**:`SYSDATE`用于获取当前系统日期和时间,而`TRUNC...
某些情况下,用JOIN代替EXISTS可以简化查询并提高性能,特别是当JOIN条件与WHERE子句中的条件一致时。 **12. 大于或小于操作符** 在可能的情况下,使用大于等于(>=)和小于等于(包括等号)操作符,避免使用BETWEEN...
- 使用`NOT EXISTS`代替`NOT IN`,因为`NOT IN`可能会导致全表扫描。 - 例如,查询部门表中没有员工的部门名称: ```sql SELECT dname, deptno FROM dept WHERE NOT EXISTS (SELECT deptno FROM emp WHERE dept....
- `IN`、`NOT IN`、`EXISTS`、`NOT EXISTS` - **示例**: - `SELECT * FROM orders WHERE order_id IN (100, 200, 300)`:此查询将返回订单ID为100、200或300的所有订单记录。 ##### 3. **范围运算符** - `...
12. **NOT EXISTS与NOT IN的比较**: - `NOT IN`可能导致全表扫描,而`NOT EXISTS`则不会,因此在大多数情况下推荐使用`NOT EXISTS`。 13. **使用EXISTS代替子查询**: - 与普通的子查询相比,使用`EXISTS`可以...
8. **用NOT EXISTS替换NOT IN**:在否定子查询中,NOT EXISTS通常比NOT IN快,因为NOT EXISTS只需检查是否存在匹配项,而NOT IN可能需要遍历整个子查询结果。 这些技巧可以帮助数据库管理员和开发人员优化Oracle ...
- `NOT IN`和`NOT EXISTS`用于排除不符合条件的记录。 - `NOT IN`可能会遇到空值问题,导致结果不准确;而`NOT EXISTS`则不会受到空值的影响。 ### 9. EXISTS 和 DISTINCT 的使用 #### 知识点: - `DISTINCT`用于...