oracle in和exists、not in和not exists原理和性能探究
对于in和exists、not in和not exists还是有很多的人有疑惑,更有甚者禁用not in,所有的地方都要用not exists,它真的高效吗?通过下面的使用我们来证明。
先制造一些数据
SQL> drop table test1 purge;
SQL> drop table test2 purge;
SQL> create table test1 as select * from dba_objects where rownum <=1000;
SQL> create table test2 as select * from dba_objects;
SQL> exec dbms_stats.gather_table_stats(user,'test1');
SQL> exec dbms_stats.gather_table_stats(user,'test2');
SQL> set autotrace traceonly
in和exists原理及性能实验:
SQL> select * from test1 t1 where t1.object_id in (select t2.object_id from test2 t2);
已选择1000行。
执行计划
----------------------
Plan hash value: 3819917785
----------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------
| 0 | SELECT STATEMENT | | 997 | 84745 | 168 (3)| 00:00:03 |
|* 1 | HASH JOIN SEMI | | 997 | 84745 | 168 (3)| 00:00:03 |
| 2 | TABLE ACCESS FULL| TEST1 | 1000 | 80000 | 5 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| TEST2 | 50687 | 247K| 162 (2)| 00:00:02 |
----------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
统计信息
----------------------
1 recursive calls
0 db block gets
95 consistent gets
0 physical reads
0 redo size
45820 bytes sent via SQL*Net to client
1111 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1000 rows processed
SQL> select * from test1 t1
2 where exists (select 1 from test2 t2 where t1.object_id = t2.object_id);
已选择1000行。
执行计划
----------------------
Plan hash value: 3819917785
----------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------
| 0 | SELECT STATEMENT | | 997 | 84745 | 168 (3)| 00:00:03 |
|* 1 | HASH JOIN SEMI | | 997 | 84745 | 168 (3)| 00:00:03 |
| 2 | TABLE ACCESS FULL| TEST1 | 1000 | 80000 | 5 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| TEST2 | 50687 | 247K| 162 (2)| 00:00:02 |
----------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
统计信息
----------------------
0 recursive calls
0 db block gets
95 consistent gets
&nbs