Oracle中的EXISTS与IN
我看到有的帖子上说OracleSQL中尽量用EXISTS代替IN,但我后来看应该准确讲是:对于带有子表查询的情况,使用EXISTS效率要高于IN,但如果仅仅是字段选择,例...
我看到有的帖子上说Oracle SQL中尽量用EXISTS代替IN,但我后来看应该准确讲是:
对于带有子表查询的情况,使用EXISTS效率要高于IN,但如果仅仅是字段选择,例如:
select * from table where num in (1, 2, 3);是比select * from table where num=1 or num=2 or num=3;效率高,是这样么?谢谢!
但为什么我使用select * from table where num in (1, 2, 3);要比select * from table where num=1 or num=2 or num=3;稍慢呢?只是碰巧?好像in会自动转换为or操作,是这样的? 展开
对于带有子表查询的情况,使用EXISTS效率要高于IN,但如果仅仅是字段选择,例如:
select * from table where num in (1, 2, 3);是比select * from table where num=1 or num=2 or num=3;效率高,是这样么?谢谢!
但为什么我使用select * from table where num in (1, 2, 3);要比select * from table where num=1 or num=2 or num=3;稍慢呢?只是碰巧?好像in会自动转换为or操作,是这样的? 展开
1个回答
展开全部
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,这是毫无疑问的。
传统上认为,如果子查询的条件更具选择性(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,这是毫无疑问的。
威孚半导体技术
2024-08-19 广告
2024-08-19 广告
威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层...
点击进入详情页
本回答由威孚半导体技术提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询