`
wanglei8
  • 浏览: 68327 次
  • 性别: 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使用

    oracle数据库关于exists使用方法与in的比较

    in和exists的区别

    “exists”和“in”是Oracle中,都是查询某集合的值是否存在在另一个集合,但对不同的数据有不同的用法,主要是在效率问题上存在很大的差别,以下有两个简单例子,以说明 “exists”和“in”的效率问题。

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

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

    简述Oracle中in和exists的不同

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

    in和exists性能解析

    oracle in和exists性能解析

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

    里面自己根据网上的资源整理出来的一份sql中in,exists,not in,not exists的使用方法以及注意事项等,有助于初学的朋友们借鉴。

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

    一个是问in exist的区别,一个是not in和not exists的区别

    Oracle: minus | in | exists

    NULL 博文链接:https://wuaner.iteye.com/blog/1671927

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

    自己常用的oracle 管理 优化 /** ... 6,where 子句中避免在索引列上使用计算 如果索引不是基于函数的,那么当在where子句中对索引列使用函数的时 ,索引不在起作用。因此避免在索引列上使用计算

    oracle的sql优化

     对Oracle共享池和缓冲区中的Sql必须要大小写都完全用上才能够匹配上 2.顺序问题  Oracle按照从右到左的顺序对数据表进行解析。因此From最后面的表为基础表,一般要选择记录数最少的表作为基础表。  对于Where...

    oracle advanced sql 高级SQL教程 ORACLE官方教材

    Using a Subquery in the FROM Clause 4-10 Scalar Subquery Expressions 4-11 Scalar Subqueries: Examples 4-12 Correlated Subqueries 4-14 Using Correlated Subqueries 4-16 Using the EXISTS Operator 4-18 ...

    Oracle数据库Sql性能调优

    1.8 SELECT子句中避免使用 ‘ *‘ 7 1.9 减少访问数据库的次数 7 1.10 使用DECODE函数来减少处理时间 8 1.11 删除重复记录 8 1.12 用TRUNCATE替代DELETE 9 1.13 尽量多使用COMMIT 9 1.14 计算记录条数 9 1.15 用...

    ORACLE9i_优化设计与系统调整

    §3.2.2 在参数值中使用特殊字符 65 §3.2.3 修改参数值 66 §3.2.4 显示当前参数值 69 §3.2.5 参数的使用 69 §3.2.6 参数的类型 69 §3.2.7 不能在参数文件中指定的参数 70 §3.2.8 当参数指定错误时怎么办? 70 ...

    oracle学习日志总结

    尽量使用“>=”,不要使用“>”,用EXISTS代替IN(外表数据小情况),用大于或小于代替不等于,用右模糊查询(LIKE ‘…%’)代替模糊查询,用UNION ALL代替UNION,union代替or,trancate代替delete等. 7. count(1)比...

    Oracle数据库SQL语句优化策略

    尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替 用IN写出来的SQL的优点是比较容易写及清晰易懂,但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:...

    oracle高级sql讲解课程

    with子句使用,集合操作,case应用,行列互换,4 exists与in、not exists与not in

    Oracle内部培训汇总

    oracle进阶教程 1、优化器 2、连接 3、in和exists 4、hint 5、index 6、收集统计信息 7、优化技巧

    Oracle数据库、SQL

    1.16课程中使用的5个表 3 二、 select from语句 5 2.1 select语句功能 5 2.2 select语句基本语法 5 2.3列别名 5 2.4算术表达式 5 2.5空值null的处理 5 2.6 nvl(p1,p2)函数 5 2.7拼接运算符 || 6 2.8文字字符串 6 2.9...

Global site tag (gtag.js) - Google Analytics