Welcome 微信登录

首页 / 数据库 / MySQL / Oracle not exists的等价写法

not exists可以改为left join + is null,可以看到改写前后执行计划一样,消耗资源一样,说明完全等价。SQL> drop table test purge;SQL> drop table test1 purge;
SQL> create table test as select * from dba_objects;
SQL> create table test1 as select * from dba_objects;
SQL> delete from test1 where rownum < 10;
SQL> commit;SQL> select count(1) from test t where not exists(
   select 1 from test1 t1 where t1.object_id=t.object_id
    );
  COUNT(1)
----------
        11
SQL> select count(1) from test t,test1 t1 where t.object_id=t1.object_id(+)
    and t1.object_id is null;
  COUNT(1)
----------
        11
SQL> select * from test t where not exists(
   select 1 from test1 t1 where t1.object_id=t.object_id
    )
    minus
    select t.* from test t,test1 t1 where t.object_id=t1.object_id(+)
    and t1.object_id is null;
未选定行SQL> select t.* from test t,test1 t1 where t.object_id=t1.object_id(+)
    and t1.object_id is null
    minus
    select * from test t where not exists(
   select 1 from test1 t1 where t1.object_id=t.object_id
    );
未选定行SQL> set autotrace traceonly
SQL> select t.* from test t where not exists(
   select 1 from test1 t1 where t1.object_id=t.object_id
    );
已选择11行。
执行计划
----------------------------------------------------------
Plan hash value: 2726816538
--------------------------------------------------------------------------------------
| Id  | Operation            | Name  | Rows  | Bytes |TempSpc| Cost (%CPU)| Time   |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT   |     | 72877 |    15M|     |  1109 (1)| 00:00:16 |
|*  1 |  HASH JOIN RIGHT ANTI|     | 72877 |    15M|  1520K|  1109 (1)| 00:00:16 |
| 2 | TABLE ACCESS FULL  | TEST1 | 61874 | 785K|     | 196 (1)| 00:00:03 |
| 3 | TABLE ACCESS FULL  | TEST  | 72877 |    14M|     | 197 (2)| 00:00:03 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
 1 - access("T1"."OBJECT_ID"="T"."OBJECT_ID")
Note
-----
 - dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
          7  recursive calls
          0  db block gets
     1142  consistent gets
          0  physical reads
          0  redo size
     1577  bytes sent via SQL*Net to client
        337  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
       11  rows processed
SQL> select t.* from test t,test1 t1 where t.object_id=t1.object_id(+)
  2  and t1.object_id is null;
已选择11行。
执行计划
----------------------------------------------------------
Plan hash value: 2726816538
--------------------------------------------------------------------------------------
| Id  | Operation            | Name  | Rows  | Bytes |TempSpc| Cost (%CPU)| Time   |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT   |     | 72877 |    15M|     |  1109 (1)| 00:00:16 |
|*  1 |  HASH JOIN RIGHT ANTI|     | 72877 |    15M|  1520K|  1109 (1)| 00:00:16 |
| 2 | TABLE ACCESS FULL  | TEST1 | 61874 | 785K|     | 196 (1)| 00:00:03 |
| 3 | TABLE ACCESS FULL  | TEST  | 72877 |    14M|     | 197 (2)| 00:00:03 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
 1 - access("T"."OBJECT_ID"="T1"."OBJECT_ID")
Note
-----
 - dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
          7  recursive calls
          0  db block gets
     1142  consistent gets
          0  physical reads
          0  redo size
     1577  bytes sent via SQL*Net to client
        337  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
       11  rows processedOracle 单实例 从32位 迁移到 64位 方法  http://www.linuxidc.com/Linux/2012-03/55759.htm在CentOS 6.4下安装Oracle 11gR2(x64) http://www.linuxidc.com/Linux/2014-02/97374.htmOracle 11gR2 在VMWare虚拟机中安装步骤 http://www.linuxidc.com/Linux/2013-09/89579p2.htmDebian 下 安装 Oracle 11g XE R2 http://www.linuxidc.com/Linux/2014-03/98881.htmOracle导入导出expdp IMPDP详解 http://www.linuxidc.com/Linux/2014-04/99932.htmOracle 10g expdp导出报错ORA-4031的解决方法 http://www.linuxidc.com/Linux/2014-04/99842.htm更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址