oracle中in,not in和exists,not exists之间的区别
答案:3 悬赏:20
解决时间 2021-02-15 16:48
- 提问者网友:巴黎塔下许过得承诺
- 2021-02-14 16:38
oracle中in,not in和exists,not exists之间的区别
最佳答案
- 二级知识专家网友:duile
- 2021-02-14 16:58
n的方式比较直观,exists则有些绕,in和exists需要具体情况具体分析;
而not extsts 的子查询依然能用到表上的索引。
所以无论那个表大。
也就是说,而且in可以用于各种子查询,not in和not exists就不用分析了,可惜没意义)。
由于exists是用loop的方式,所以,所以,外表要记录数少,内表就无所谓了,而in用的是hash join,所以内表如果小,整个查询的范围都会很小,如果内表很大,用not exists都比not in要快,这时候exists才真正的会快过in的方式,循环的次数对于exists影响最大。
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引,外表如果也很大就很慢了,而exists好像只用于关联子查询(其他子查询当然也可以用
而not extsts 的子查询依然能用到表上的索引。
所以无论那个表大。
也就是说,而且in可以用于各种子查询,not in和not exists就不用分析了,可惜没意义)。
由于exists是用loop的方式,所以,所以,外表要记录数少,内表就无所谓了,而in用的是hash join,所以内表如果小,整个查询的范围都会很小,如果内表很大,用not exists都比not in要快,这时候exists才真正的会快过in的方式,循环的次数对于exists影响最大。
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引,外表如果也很大就很慢了,而exists好像只用于关联子查询(其他子查询当然也可以用
全部回答
- 1楼网友:茫然不知崩溃
- 2021-02-14 18:16
存在测试IN、NOT IN、EXISTS、NOT EXISTS
例:SELECT * FROM SC WHERe SNO IN
(SELECt SNO FROM STUDENT WHERe SSEX=’女’);
同:SELECt * FROM SC WHERe EXISTS
(SELECt * FROM STUDENT WHERe SSEX=’女’ AND SC.SNO=SNO);
返回所有女生的成绩
例:SELECt * FROM SC WHERe SNO NOT IN
(SELECt SNO FROM STUDENT WHERe SSEX=’女’);
同:SELECt * FROM SC WHERe NOT EXISTS
(SELECt * FROM STUDENT WHERe SSEX=’女’ AND SC.SNO=SNO);
返回性别不为女的记录
说明:使用EXISTS相比IN,当使用IN检索到数据非常少时,IN比EXISTS快,反之,使用EXISTS比IN快。
如果EXISTS后面的SELECt * 改为SELECT ‘常量’(例如,a, b, c等),速度会更快。
谓词中含有“全部、至少、没有”时,使用NOT EXISTS.
oracle中in,not in和exists,not exists之间的区别 一直听到的都是说尽量用exists不要用in,因为exists只判断存在而in需要对比值,所以exists比较快,但看了看网上的一些东西才发现根本不是这么回事。
下面这段是抄的
Select * from T1 where x in ( select y from T2 )
执行的过程相当于:
select *
from t1, ( select distinct y from t2 ) t2
where t1.x = t2.y;
select * from t1 where exists ( select null from t2 where y = x )
执行的过程相当于:
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
从我的角度来说,in的方式比较直观,exists则有些绕,而且in可以用于各种子查询,而exists好像只用于关联子查询(其他子查询当然也可以用,可惜没意义)。
由于exists是用loop的方式,所以,循环的次数对于exists影响最大,所以,外表要记录数少,内表就无所谓了,而in用的是hash join,所以内表如果小,整个查询的范围都会很小,如果内表很大,外表如果也很大就很慢了,这时候exists才真正的会快过in的方式。
下面这段还是抄的
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
而not extsts 的子查询依然能用到表上的索引。
所以无论那个表大,用not exists都比not in要快。
也就是说,in和exists需要具体情况具体分析,not in和not exists就不用分析了,尽量用not exists就好了。
典型的连接类型共有3种:
排序 - - 合并连接(Sort Merge Join (SMJ) )
嵌套循环(Nested Loops (NL) )
哈希连接(Hash Join)
嵌套循环和哈希连接的算法还是有不同,在理论上哈希连接要快过排序和nl,当然实际情况比理论上有复杂的多,不过两者还是有差异的
- 2楼网友:兮沫♡晨曦
- 2021-02-14 17:22
in和exist的主要区别体现在对sql执行计划的影响上。
传统上认为,如果子查询的条件更具选择性(selective),就用in;而如果父查询(外层查询)的条件更具选择性(selective),就用exist。
具体的内容可以参考以下oracle原厂的手册,不好意思,oracle的原厂手册都是英文版的。
对于你举的那个例子,用in和用or是一样的,因为它们的执行计划肯定是一样的。
另外需要特别注意的是,in和exist的区别只在10.2.0.3及以前的版本中存在;而10.2.0.4及以后的版本中,in和exist的效果是完全一样的,手册中也删除了有关二者区别的说明。
以下是对手册的引用:
in certain circumstances, it is better to use in rather than exists. in general, if the selective predicate is in the subquery, then use in. if the selective predicate is in the parent query, then use exists.
sometimes, oracle can rewrite a subquery when used with an in clause to take advantage of selectivity specified in the subquery. this is most beneficial when the most selective filter appears in the subquery and there are indexes on the join columns. conversely, using exists is beneficial when the most selective filter is in the parent query. this allows the selective predicates in the parent query to be applied before filtering the rows against the exists criteria.
补充:
看sql语句看执行计划就可以了,没必要比较某次的时间长短,因为语句执行时间长短跟很多其他因素有关,比如数据是否在buffer cache中(第二次执行一般会比第一次快不少)、数据库负载不同等。对于常量,in的效果完全等同于or,这是毫无疑问的。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯