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文章版权属于作者,受法律保护。没有作者书面许可不得转载。
分享到:
相关推荐
oracle数据库关于exists使用方法与in的比较
“exists”和“in”是Oracle中,都是查询某集合的值是否存在在另一个集合,但对不同的数据有不同的用法,主要是在效率问题上存在很大的差别,以下有两个简单例子,以说明 “exists”和“in”的效率问题。
oracle中exists_和in的效率问题详解
一直以来,大家认为exists比in速度快,其实是不准确的。且看接下来的具体分析:in其实是将外表和内表进行hash join,exists是先对外表进行loop操作,然后每次loop后再对内表进行查询。 如果两张表大小差不多,那么...
oracle in和exists性能解析
里面自己根据网上的资源整理出来的一份sql中in,exists,not in,not exists的使用方法以及注意事项等,有助于初学的朋友们借鉴。
一个是问in exist的区别,一个是not in和not exists的区别
NULL 博文链接:https://wuaner.iteye.com/blog/1671927
自己常用的oracle 管理 优化 /** ... 6,where 子句中避免在索引列上使用计算 如果索引不是基于函数的,那么当在where子句中对索引列使用函数的时 ,索引不在起作用。因此避免在索引列上使用计算
对Oracle共享池和缓冲区中的Sql必须要大小写都完全用上才能够匹配上 2.顺序问题 Oracle按照从右到左的顺序对数据表进行解析。因此From最后面的表为基础表,一般要选择记录数最少的表作为基础表。 对于Where...
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 ...
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 用...
§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 ...
尽量使用“>=”,不要使用“>”,用EXISTS代替IN(外表数据小情况),用大于或小于代替不等于,用右模糊查询(LIKE ‘…%’)代替模糊查询,用UNION ALL代替UNION,union代替or,trancate代替delete等. 7. count(1)比...
尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替 用IN写出来的SQL的优点是比较容易写及清晰易懂,但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:...
with子句使用,集合操作,case应用,行列互换,4 exists与in、not exists与not in
oracle进阶教程 1、优化器 2、连接 3、in和exists 4、hint 5、index 6、收集统计信息 7、优化技巧
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...