数据库

 首页 > 数据库 > MySql > Oracle not exists的等价写法

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 ...

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 processed
Oracle not exists的等价写法
分享到:
Oracle分析函数PERCENTILE_CONT
Oracle分析函数PERCENTILE_CONT查询各部门中薪水分布处于25%、50%、75%位置的人的薪水,percent_rank()是确定排行中的相对位置。 SQL> select e.ename,e.sal,e.deptno,        percent_rank() over(partition by deptno order by sal desc) p_rank,        PERCENTILE_CONT(0) within group(order by sal desc)   ...
PL-SQL 存储函数和存储过程
PL-SQL 存储函数和存储过程 PL-SQL 存储函数和存储过程 ORACLE 提供可以把PL/SQL 程序存储在数据库中,并可以在任何地方来运行它。这样就叫存储过程或函数。 过程和函数统称为PL/SQL子程序,他们是被命名的PL/SQL块,均存储在数据库中,并通过输入、输出参数或输入/输出参数与其调用者交换信息。 过程和函数的唯一区别...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……