中易网

oracle中in,not in和exists,not exists之间的区别

答案:3  悬赏:20  
解决时间 2021-02-15 16:48
oracle中in,not in和exists,not exists之间的区别
最佳答案
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好像只用于关联子查询(其他子查询当然也可以用
全部回答
存在测试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,当然实际情况比理论上有复杂的多,不过两者还是有差异的
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,这是毫无疑问的。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我想开一家小型的牛奶加工厂,请有经验者帮助
老台门精作鲜包浐灞半岛店地址在什么地方,想
凯撒旅游这只股票近期怎么样
把三个苹果平均分成四份,每份是多少个,每份
2012年7月17日下午大约4:左右生的孩子什么命
电影《霍元甲》中最后李连杰打的拳是什么招式
为什么手机卡的要死,而且手机内存占用的很少
安达喷涂厂地址在什么地方,想过去办事
“有没有搞错”广东话怎么说?求语音,求标准
中原百姓广场建材馆西三号门怎么去啊,有知道
酒店承包宴席后是否正常营业
24岁了,没女朋友,现在没稳定工作朋友不介绍
理想诗歌第一节主要运用了什么什么和什么的修
盐城创新创业创意中心地址在哪,我要去那里办
唐代隐逸诗人为什么要选择这种生活方式
推荐资讯
巧媳妇炸酱面地址在什么地方,想过去办事
飞机装配应该遵循什么原则
孙思怡的档案?
妻子去世后 岳父岳母有权继承房子吗
请问我家小孩为什么会阴部老是红的急急
林南天一电机配件厂地址在哪,我要去那里办事
凌源市美稼生资联行在什么地方啊,我要过去处
长虹空调在恒温情况下扇叶会转动吗?
永兴综合商店这个地址在什么地方,我要处理点
安乐路/G101(路口)我想知道这个在什么地方
中国移动通信昆山萧林路指定专营店这个地址在
哪个小区对口上海闸北新中高级中学
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?