oracle where exists 2

Where exists 2
前边按照个人驾驭讲了基本的select 用法。当然 exists
并不仅仅只可以更在select之后。比如update 也可以利用 where exists
持续此前的上课,我从网上看到说。Where exists 和 In
作用不均等,就来做个试验相比一下什么样分化。
第一成立一个测试表 t4
create table t4 as select * from emp;
插入数据
insert into t4 select * from t4;
select count(*) from t4;

COUNT(*)

14680064
commit;
接下去写三个等价的 exists 和 in 的询问依据实施安插 具体来分析一下。
set autot traceonly
select empno,ename from emp where exists (select 1 from t4 where
t4.deptno=emp.deptno);

14 rows selected.

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

| 0 | SELECT STATEMENT | | 20 | 740 | 43 (0)| 00:00:01 |
| 1 | NESTED LOOPS SEMI | | 20 | 740 | 43 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 20 | 480 | 3 (0)| 00:00:01 |

|* 3 | INDEX RANGE SCAN | DEPTNOIND | 3804K| 47M| 2 (0)| 00:00:01 |

select a.empno,a.ename from emp a where a.deptno in (select deptno from

t4 );

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

| 0 | SELECT STATEMENT | | 20 | 740 | 43 (0)| 00:00:01 |
| 1 | NESTED LOOPS SEMI | | 20 | 740 | 43 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 20 | 480 | 3 (0)| 00:00:01 |

|* 3 | INDEX RANGE SCAN | DEPTNOIND | 3804K| 47M| 2 (0)| 00:00:01 |

从如上来看,两条语句的施行陈设是一摸一样的。我又屡次测试了多少个 exists 和
in
的口舌,发现但从执行安顿来看,看不出来什么,或许是自己写的太不难,于是从网上查询了有的素材结合自己的了然。
想从履行原理去解释一下。
where exists 的规律是循环。从前也说道过,exists
应该是先去巡回父表,不断的取出表中的多少。然后将以此取出的多寡和
子查询中的条件去一起查询,然后重临值,若是有重返值,则取出那条记下输出,假诺记录不同盟则不重回值。
in 的规律如下。
select a.empno,a.ename from emp a where a.deptno in (select deptno from
t4); 可以等价替换为
select a.empno,a.ename from emp a,(select distinct deptno from t4) b
where a.deptno=b.deptno;
那时候就能见到不相同来了:
先是 where exists
中会做父表的遍历和对子表的查询(即使此处的对子表的遍历,应该是只符合条件就会回去,并不一定会完全遍历完子表)。要是在父表小,子表大的气象下,那种写法的频率会很高,并且
t4.deptno=emp.deptno,是可以走索引的。作用不会很差。不过只要父表很大的意况下,那种频率就不会很高。因为要对父表进行遍历(全表扫描)。
而in 的对等替换中的(select distinct deptno from t4),若是t4
这一个表很小的动静下,效能也是非凡快的。可是这几个讲话在 t4
很大的景象下效能是相当低的。首先 oracle 会先挂起
父查询的口舌,先去将子查询执行完成后,再举行关联查询。这时候,假诺父表很大而子表很小,功能就会比 where exists 高。
看来,in 和 where exists
在五个表想当的状态下,作用应该是大致的。
不过一旦在父表大子表小的动静下 in 的频率要比 where exists快。
反倒倘若是在子表大而父表小的意况下这时候where exists
的频率就要比in快了。

 

相关文章