有两个简单例子,以说明 “exists”和“in”的效率问题
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
exists 用法:
请注意 1)句中的有颜色字体的部分 ,理解其含义;
其中 “select 1 from T2 where T1.a=T2.a” 相当于一个关联表查询,相当于
“select 1 from T1,T2 where T1.a=T2.a”
但是,如果你当当执行 1) 句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。
“exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。
因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这 1) 句的where 条件成立。
in 的用法:
继续引用上面的例子
“2) select * from T1 where T1.a in (select T2.a from T2) ”
这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。
打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用 2)的写法就可以这样:
“select * from T1 where T1.ticketid in (select T2.id from T2) ”
Select name from employee where name not in (select name from student);
Select name from employee where not exists (select name from student);
第一句SQL语句的执行效率不如第二句。
通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因
分享到:
相关推荐
Oracle 中 EXISTS 和 IN 的效率问题详解 EXISTS 和 IN 都是 Oracle 中的集合操作符,但它们在使用和执行效率上有所不同。本文将深入探讨 EXISTS 和 IN 的使用场景、执行机制和效率问题。 EXISTS 的使用场景和机制 ...
### Oracle数据库中Exists与In的使用详解 #### 一、Exists 的使用方法 在Oracle数据库中,`EXISTS` 是一种常用的子查询操作符,用于判断子查询是否有结果返回。如果子查询至少返回一行数据,则 `EXISTS` 表达式的...
在Oracle数据库中,`NOT EXISTS` 子句常用于查询中,以排除某些特定条件的记录。然而,它对查询性能的影响可能并不总是直观的,尤其是在涉及到外层查询时。本文将深入探讨`NOT EXISTS`如何影响外层查询,并通过示例...
### "Exists"与"In"的效率问题详解 #### 引言 在数据库查询语言SQL中,“Exists”与“In”是两种常用的子查询方法,它们在实际应用中各有优势与局限。本文将深入探讨这两种方法的工作原理、应用场景以及性能差异,...
- **规则描述**:在查询语句中,如果需要检查某个值是否存在于另一个表中,使用EXISTS子句通常比使用IN子句更高效。 - **示例**:查询所有有订单的客户信息,可以使用EXISTS而不是IN: - 低效:`SELECT * FROM ...
- **EXP 和 IMP**:这是在Oracle 10g之前的版本中使用的工具,它们既可以作为客户端工具使用,也可以在服务器端使用。 - **EXPDP 和 IMPDP**:这些工具仅能在Oracle服务器端使用,无法在客户端运行。 - **兼容性**:...
oracle数据泵详解 Oracle 数据泵是 Oracle 10g 以后引入的一种数据迁移工具,可以方便我们把低版本的数据库数据向高版本的数据库迁移。下面是 Oracle 数据泵的详细介绍。 一、EXPDP 和 IMPDP 使用说明 EXPDP...
在描述中提到的符号和操作符,例如`+`、`-`、`*`、`/`用于基本的数学运算,`IS NULL`和`IS NOT NULL`用于检查值是否存在,`BETWEEN`、`NOT BETWEEN`用于区间判断,`IN`、`NOT IN`、`ANY`、`SOME`、`ALL`用于集合比较...
`always_anti_join`控制优化器如何处理NOT IN子查询,可以选择NESTED_LOOPS、MERGE或HASH方法。`always_semi_join`则影响EXISTS子查询的执行,当没有索引时,半连接可能会提高性能。 2. **aq_tm_processes**:此...
- `NOT IN`可能导致全表扫描,而`NOT EXISTS`则不会,因此在大多数情况下推荐使用`NOT EXISTS`。 13. **使用EXISTS代替子查询**: - 与普通的子查询相比,使用`EXISTS`可以减少查询的复杂度和提高性能。 14. **...
在数据库系统中,尤其是在大型企业级应用中,Oracle 数据库因其稳定性和强大的功能被广泛使用。然而,随着数据量的增长和业务复杂性的增加,如何有效地优化 Oracle 查询成为了一个重要的课题。本文将详细探讨 Oracle...
根据提供的文件内容,可以看出文档主要涉及的是Oracle SQL的基础语法与函数使用详解。下面将对文档中的各个知识点进行详细的解释和扩展。 ### Oracle SQL基础语法与函数详解 #### 1. 基本运算符 在Oracle SQL中,...
SQL 中 IN 参数化的用法详解 在 SQL 中,对于 IN 操作符的使用是非常常见的,特别是在 WHERE 子句中规定多个值时。如:select * from A where ID in (1,2,3,4)。但是在实际开发中,我们不可避免地需要处理大量的...
通过本文,我们将详细介绍Oracle中常见的通配符及其用法,帮助读者更好地理解和运用这些符号,从而提高SQL查询的灵活性和效率。 #### 一、通配符概述 在Oracle SQL中,通配符主要用于`LIKE`操作符中,用于模糊查询...
2. EXISTS和NOT EXISTS子句通常用于子查询中,用以判断子查询返回的结果集是否为空。EXISTS子句在找到至少一条符合条件的记录时就会返回TRUE,而不关心具体有多少条符合条件的记录;相反,NOT EXISTS子句则用于判断...
15. **EXISTS, IN, NOT EXISTS, NOT IN的比较**:在进行数据检索时,正确使用EXISTS与NOT EXISTS通常比使用IN与NOT IN更高效,尤其是在处理大量数据时。例如: ```sql SELECT * FROM EMP WHERE EMPNO > 0 AND ...
本文详细介绍了Oracle数据库中常用的通配符和运算符,包括它们的定义、用法以及具体的应用示例。通过学习这些内容,您可以更加熟练地进行数据检索和处理,从而提高工作效率。希望本文能够帮助您更好地理解和掌握...
使用`NOT IN`或`NOT EXISTS`时,需谨慎,因为它们可能导致Oracle执行多次全表扫描,特别是在没有适当索引的情况下。推荐使用`LEFT JOIN`和`IS NULL`的组合来替代`NOT IN`,以减少扫描次数。 ##### 2.6 IN和EXISTS ...