SQL> set lines 150;
SQL> explain plan for select a.ename,b.ename from emp a,emp b where a.mgr=b.empno(+);Explained.SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------
Plan hash value: 2341341676---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    14 |   560 |     7  (15)| 00:00:01 |
|*  1 |  HASH JOIN OUTER   |      |    14 |   560 |     7  (15)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |   280 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| EMP  |    14 |   280 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------   1 - access("A"."MGR"="B"."EMPNO"(+))Note
-----
   - dynamic sampling used for this statement19 rows selected.===============================================================================================
SQL> explain plan for select e.ename,(select ename from emp where e.mgr=empno) mgr from emp e;Explained.SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------
Plan hash value: 4000517069--------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |    14 |   280 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |     1 |    20 |     2   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | PK_EMP |     1 |       |     1   (0)| 00:00:01 |
|   3 |  TABLE ACCESS FULL          | EMP    |    14 |   280 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------   2 - access("EMPNO"=:B1)Note
-----
   - dynamic sampling used for this statement19 rows selected.SQL> 

解决方案 »

  1.   

    这个语句执行速度的快慢没有绝对性,和数据量、服务器的io性能等都有关系
    1、一般来说对于大数据量的表来说第一种外连接的执行速度要快一点
    2、对于小数据量的表,子查询的数据表的数据都可以读取到内存中
    这种情况下,减少了大量的io方面的消耗,子查询的方式会快一些
      

  2.   

    严格来说,这两个语句并不等价。如果 empno 不是唯一的,第一条语句出的数据,第二条语句会报错的。如果 empno 是唯一的,并且建立了 PK 或IX ,那么这两条语句在数据量小的情况下,第二条会效率高一些。 数据量很大了,第一条会高一些。个人意见,欢迎讨论。