ACCESSoracle 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 |
ACCESS,| 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快了。

 

相关文章