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文章版权属于作者,受法律保护。没有作者书面许可不得转载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值