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快了。

 

相关文章