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

Oracle中in与exists使用上的区别

阅读更多
in与exists处理起来是非常不同的。

1.这里使用in方式关联两个表,称为第一个查询。
select * from t1 where x in(select y from t2);

这条sql语句处理起来就像如下:
select * 
from t1,(select distinct y from t2)t2
where t1.x = t2.y;

这个子查询被评估,去重复(distincted), 被使用索引(indexed)(或者 hashed 或者 sorted),然后与原始表(t1表)连接


2.这里使用exists方式关联两个表,称为第二个查询。
select * from t1 where exists(select null from t2 where y = x);

这条sql语句被处理起来更像:
for x in(select * from t1)
loop
	if(exists(select null from t2 where y = x.x)) then
		OUTPUT THE RECORD
	end if;
end loop;

这种处理总是对t1表产生一个全表扫描(full scan),然而第一个查询能够使用T1表的x列上的索引。
所以,大家有疑问了,在什么时候,在哪里,使用exists适合,或者不适合呢?

好的,下面来看看这个子查询的结果
如果
(select y from t2)
这个表很大,需要花费很长的时间。但是t1表相对小,
(select null from t2 where y = x.x)
这个查询的执行速度非常快(之所以快,得益于t2表y列上的索引),那么exists将会更快。这里,首先全表扫描t1表,对t2做索引查询能够比全表扫描t2表,再构建distinct子查询花更少的时间。


如果
(select y from t2)
子查询的结果小,那么in更合适。

如果子查询和外表都很大(exists和in查询时间差不多),那么就依赖于索引和其他因素了。



声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
1
0
分享到:
评论
2 楼 wanglei8 2009-07-17  
cooldh 写道
懂了一些。

这个查询的执行速度非常快(之所以快,得益于t2表y列上的索引),那么exists将会更快。这里,首先全表扫描t1表,对t2做索引查询能够比全表扫描t2表,再构建distinct子查询花更少的时间。

这里没懂,t1表在哪啊?没看到。

select * from t1 where exists(select null from t2 where y = x); 

t1表在这里
1 楼 cooldh 2009-06-23  
懂了一些。

这个查询的执行速度非常快(之所以快,得益于t2表y列上的索引),那么exists将会更快。这里,首先全表扫描t1表,对t2做索引查询能够比全表扫描t2表,再构建distinct子查询花更少的时间。

这里没懂,t1表在哪啊?没看到。

相关推荐

    oracle中exists_和in的效率问题详解

    EXISTS 和 IN 都是 Oracle 中的集合操作符,但它们在使用和执行效率上有所不同。本文将深入探讨 EXISTS 和 IN 的使用场景、执行机制和效率问题。 EXISTS 的使用场景和机制 EXISTS 主要用于判断子查询是否存在记录...

    oracle数据库关于exists使用

    ### Oracle数据库中Exists与In的使用详解 #### 一、Exists 的使用方法 在Oracle数据库中,`EXISTS` 是一种常用的子查询操作符,用于判断子查询是否有结果返回。如果子查询至少返回一行数据,则 `EXISTS` 表达式的...

    in和exists的区别

    在Oracle数据库中,"IN"和"EXISTS"都是用于查询某个集合的元素是否存在于另一个集合中的关键字。然而,它们在处理数据时的效率和适用场景有所不同,这主要取决于涉及的数据量以及表之间的关联。 首先,让我们来看看...

    简述Oracle中in和exists的不同

    一直以来,大家认为exists比in速度快,其实是不准确的。且看接下来的具体分析:in其实是将外表和内表进行hash join,exists是先对外表进行loop操作,然后每次loop后再对内表进行查询。 如果两张表大小差不多,那么...

    sql in,exists,not in,not exists区别

    IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,用于判断某个值是否存在于一个列表中。其基本语法...

    in和exists性能解析

    此外,考虑到数据库查询优化器的智能,有时即使代码中使用了`IN`,优化器也会自动转换为`EXISTS`的形式以提升性能。因此,理解并灵活运用这两种子句,对于提高数据库查询效率至关重要。 通过以上分析,我们不难看出...

    Oracle In和exists not in和not exists的比较分析

    在Oracle数据库中,`IN`、`EXISTS`、`NOT IN` 和 `NOT EXISTS` 是四个常用的子查询操作符,它们在SQL查询语句中扮演着不同的角色,且各有其性能特点。以下是对这些操作符的详细分析和比较。 1. `IN` 操作符: `IN` ...

    Oracle: minus | in | exists

    在Oracle数据库中,`MINUS`、`IN` 和 `EXISTS` 是三种不同的SQL查询操作符,它们各自用于特定的数据处理场景。了解并熟练掌握这些操作符对于优化查询性能和编写复杂的SQL语句至关重要。 1. **MINUS 操作符** `MINUS...

    “exists”和“in”的效率问题

    在数据库查询语言SQL中,“Exists”与“In”是两种常用的子查询方法,它们在实际应用中各有优势与局限。本文将深入探讨这两种方法的工作原理、应用场景以及性能差异,帮助读者更好地理解和选择合适的查询方式。 ###...

    oracle中not exists对外层查询的影响详解

    当我们在一个查询中使用`NOT EXISTS`时,它会检查子查询中的条件是否不成立。如果子查询返回任何记录,那么`NOT EXISTS`子句就会为假,导致外层查询的相应行被排除。反之,如果子查询没有返回任何记录,`NOT EXISTS`...

    Oracle PL SQL 开发人员试题(DBA)

    Oracle PL/SQL 开发人员试题...本资源涵盖了 Oracle PL/SQL 中的多个重要概念和语句,包括子查询、NOT IN 语句、EXISTS 语句、IN 语句和 ROWNUM 语句等。这些概念和语句是 Oracle PL/SQL 开发人员必须掌握的基本技能。

    Oracle和MySQL语句区别.doc

    例如,在Oracle中,可以使用IN、EXISTS、NOT EXISTS等关键字来实现Subquery,而在MySQL中,则使用IN、EXISTS等关键字。 索引 索引是数据库性能优化的重要手段。Oracle和MySQL都支持创建索引,但是它们在创建索引时...

    SQL中in参数化的用法

    最后一个解决方案是将 in 字句的内容放入到一个新表中,然后使用 join 或者 exists 连接该表来实现参数化查询。 我们可以使用参数化查询来实现 where in 和 like 的参数化查询,提高 SQL 的查询性能和安全性。但是...

    Oracle通配符,运算符的使用

    本文旨在深入探讨Oracle数据库中通配符与运算符的使用方法,帮助读者更好地理解和掌握这些关键概念。 #### 二、Oracle通配符详解 在Oracle数据库中,通配符主要用于模糊查询,即通过模式匹配来检索符合特定条件的...

    oracle性能优化技巧

    - 在子查询中,使用`EXISTS`通常比`IN`更高效,因为`EXISTS`可以在找到第一个匹配项后立即停止搜索。 12. **NOT EXISTS与NOT IN的比较**: - `NOT IN`可能导致全表扫描,而`NOT EXISTS`则不会,因此在大多数情况...

    Oracle高效SQL语句原则

    在 where 条件中使用函数可能会导致 Oracle database 不能使用索引,降低 SQL 语句的执行效率。因此,应该尽量避免在 where 条件中对查询列使用函数,除非建立了相应的函数索引。 3. 任何在 where 子句中使用 is ...

    oracle_sql使用.docx

    首先,当你在查询中使用组函数如MAX时,根据SQL标准,所有非组函数的列都必须在GROUP BY子句中指定。这意味着如果你有一个SELECT语句,其中包含MAX函数,但没有在GROUP BY子句中包含其他列,你会收到错误。例如,...

    Oracle语句规划详解

    - **规则描述**:在查询语句中,如果需要检查某个值是否存在于另一个表中,使用EXISTS子句通常比使用IN子句更高效。 - **示例**:查询所有有订单的客户信息,可以使用EXISTS而不是IN: - 低效:`SELECT * FROM ...

Global site tag (gtag.js) - Google Analytics