Oracle 提示

Posted by 道行尚浅 on May 6, 2012

环境准备

create table DEPT
(
  deptno NUMBER(2),
  dname  VARCHAR2(14) not null,
  loc    VARCHAR2(13) not null
)
;

create table EMP
(
  empno    NUMBER(4),
  ename    VARCHAR2(10),
  job      VARCHAR2(9),
  mgr      NUMBER(4),
  hiredate DATE,
  sal      NUMBER(7,2),
  comm     NUMBER(7,2),
  deptno   NUMBER(2)
)
;

insert into DEPT (deptno, dname, loc)
values (50, 'aa', 'ccc');
insert into DEPT (deptno, dname, loc)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into DEPT (deptno, dname, loc)
values (20, 'RESEARCH', 'DALLAS');
insert into DEPT (deptno, dname, loc)
values (30, 'SALES', 'CHICAGO');
insert into DEPT (deptno, dname, loc)
values (40, 'OPERATIONS', 'BOSTON');
commit;
prompt 5 records loaded
prompt Loading EMP...
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'SMITH', 'CLERK', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('20-02-1981', 'dd-mm-yyyy'), 1600, 300, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'WARD', 'SALESMAN', 7698, to_date('22-02-1981', 'dd-mm-yyyy'), 1250, 500, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'JONES', 'MANAGER', 7839, to_date('02-04-1981', 'dd-mm-yyyy'), 2975, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('28-09-1981', 'dd-mm-yyyy'), 1250, 1400, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'BLAKE', 'MANAGER', 7839, to_date('01-05-1981', 'dd-mm-yyyy'), 2850, null, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'CLARK', 'MANAGER', 7839, to_date('09-06-1981', 'dd-mm-yyyy'), 2450, null, 10);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'SCOTT', 'ANALYST', 7566, to_date('19-04-1987', 'dd-mm-yyyy'), 3000, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'KING', 'PRESIDENT', null, to_date('17-11-1981', 'dd-mm-yyyy'), 5000, null, 10);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'TURNER', 'SALESMAN', 7698, to_date('08-09-1981', 'dd-mm-yyyy'), 1500, 0, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'ADAMS', 'CLERK', 7788, to_date('23-05-1987', 'dd-mm-yyyy'), 1100, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'JAMES', 'CLERK', 7698, to_date('03-12-1981', 'dd-mm-yyyy'), 950, null, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'FORD', 'ANALYST', 7566, to_date('03-12-1981', 'dd-mm-yyyy'), 3000, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'MILLER', 'CLERK', 7782, to_date('23-01-1982', 'dd-mm-yyyy'), 1300, null, 10);
commit;


create table dao_objects1 
as select * from dba_objects ;


create table dao_objects2 
as select * from dba_objects ;

create index idx_obj_id_1   on dao_objects1(object_id) ;

create index idx_obj_name_1 on dao_objects1(object_name) ;

优化器相关


[oracle@daoserver ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Tue Jul 2 09:39:12 2019

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>  set linesize 200
SQL> set pagesize 20000
SQL> show parameter opt

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
filesystemio_options                 string      none
object_cache_optimal_size            integer     102400
optimizer_capture_sql_plan_baselines boolean     FALSE
optimizer_dynamic_sampling           integer     2
optimizer_features_enable            string      11.2.0.3
optimizer_index_caching              integer     0
optimizer_index_cost_adj             integer     100
optimizer_mode                       string      ALL_ROWS
optimizer_secure_view_merging        boolean     TRUE
optimizer_use_invisible_indexes      boolean     FALSE
optimizer_use_pending_statistics     boolean     FALSE
optimizer_use_sql_plan_baselines     boolean     TRUE
plsql_optimize_level                 integer     2


optimizer_features_enable

指定优化器版本,通常在升级后使用


create table test_skip (c1 number , c2 number ) ;

begin
  for i in 1..1000000
    loop
      
    insert into test_skip  values(0,i) ;
    insert into test_skip  values(1,i) ;
    
    if mod(i,5000)=0 then 
       commit ;
     end if ;
      
    end loop ;

end ;



create index index_skip on test_skip(c1,c2);

begin
  
 dbms_stats.gather_table_stats(ownname => 'DAO',tabname => 'TEST_SKIP',estimate_percent => 100,cascade => TRUE);
 
end ;



SQL> set autotrace trace
SQL> set linesize 200
SQL> set pagesize 2000



SQL> select * from test_skip where c2 =2 ;


Execution Plan
----------------------------------------------------------
Plan hash value: 2486253378

-------------------------------------------------------------------------------
| Id  | Operation        | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |            |     2 |    16 |     4   (0)| 00:00:01 |
|*  1 |  INDEX SKIP SCAN | INDEX_SKIP |     2 |    16 |     4   (0)| 00:00:01 |
-------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("C2"=2)
       filter("C2"=2)



SQL> select /*+ optimizer_features_enable('8.0.0')  */  * from test_skip where c2 =2 ;


Execution Plan
----------------------------------------------------------
Plan hash value: 2954005509

---------------------------------------------------------------
| Id  | Operation         | Name      | Rows  | Bytes | Cost  |
---------------------------------------------------------------
|   0 | SELECT STATEMENT  |           |     2 |    16 |   535 |
|*  1 |  TABLE ACCESS FULL| TEST_SKIP |     2 |    16 |   535 |
---------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("C2"=2)



optimizer_mode

指定优化器模式(ALL_ROWS,FIRST_ROWS)



SQL> select  *
from dao_objects1 d1, dao_objects d2
where d1.object_id = d2.object_id ;
  2    3
75278 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3133027981

-------------------------------------------------------------------------------------------
| Id  | Operation          | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |              | 74819 |    21M|       |  1769   (1)| 00:00:22 |
|*  1 |  HASH JOIN         |              | 74819 |    21M|  8040K|  1769   (1)| 00:00:22 |
|   2 |   TABLE ACCESS FULL| DAO_OBJECTS  | 75483 |  7150K|       |   302   (1)| 00:00:04 |
|   3 |   TABLE ACCESS FULL| DAO_OBJECTS1 | 74819 |    14M|       |   301   (1)| 00:00:04 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("D1"."OBJECT_ID"="D2"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)




SQL> select /*+ first_rows */ *
from dao_objects1 d1, dao_objects d2
where d1.object_id = d2.object_id
  2    3    4  ;

75278 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3367069654

---------------------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              | 74819 |    21M|   150K  (1)| 00:30:08 |
|   1 |  NESTED LOOPS                |              |       |       |            |          |
|   2 |   NESTED LOOPS               |              | 74819 |    21M|   150K  (1)| 00:30:08 |
|   3 |    TABLE ACCESS FULL         | DAO_OBJECTS  | 75483 |  7150K|   302   (1)| 00:00:04 |
|*  4 |    INDEX RANGE SCAN          | IDX_OBJ_ID_1 |     1 |       |     1   (0)| 00:00:01 |
|   5 |   TABLE ACCESS BY INDEX ROWID| DAO_OBJECTS1 |     1 |   207 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("D1"."OBJECT_ID"="D2"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)


访问路径


SQL> select *
  from dao_objects1
 where object_id = 51
   and object_name = 'I_CON1' ;  2    3    4


Execution Plan
----------------------------------------------------------
Plan hash value: 4283110399

--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |              |     7 |  1449 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS BY INDEX ROWID| DAO_OBJECTS1 |     7 |  1449 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_OBJ_ID_1 |    12 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("OBJECT_NAME"='I_CON1')
   2 - access("OBJECT_ID"=51)

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          5  recursive calls
          0  db block gets
         74  consistent gets
          0  physical reads
          0  redo size
       1606  bytes sent via SQL*Net to client
        524  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


full

指定表访问路径为全表扫描


SQL> select /*+ full( d1 ) */ *
  from dao_objects1 d1
 where object_id = 51
   and object_name = 'I_CON1' ;  2    3    4


Execution Plan
----------------------------------------------------------
Plan hash value: 415406725

----------------------------------------------------------------------------------
| Id  | Operation         | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |              |     7 |  1449 |   300   (1)| 00:00:04 |
|*  1 |  TABLE ACCESS FULL| DAO_OBJECTS1 |     7 |  1449 |   300   (1)| 00:00:04 |
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("OBJECT_ID"=51 AND "OBJECT_NAME"='I_CON1')

Note
-----
   - dynamic sampling used for this statement (level=2)




index

使用指定的索引,格式为index(表名,索引名)

  • 注意:在SQL语句中,表有别名,一定要用别名



SQL> select /*+ index( d1 idx_obj_name_1) */ *
  from dao_objects1 d1
 where object_id = 51
   and object_name = 'I_CON1' ;  2    3    4


Execution Plan
----------------------------------------------------------
Plan hash value: 3564663942

----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     7 |  1449 |    10   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS BY INDEX ROWID| DAO_OBJECTS1   |     7 |  1449 |    10   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_OBJ_NAME_1 |    12 |       |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("OBJECT_ID"=51)
   2 - access("OBJECT_NAME"='I_CON1')

Note
-----
   - dynamic sampling used for this statement (level=2)


no_index

  • 禁用指定的索引,格式为index(表名,索引名)


SQL> select /*+ no_index( d1 IDX_OBJ_ID_1) */ *
  from dao_objects1 d1
 where object_id = 51
   and object_name = 'I_CON1' ;  2    3    4


Execution Plan
----------------------------------------------------------
Plan hash value: 3564663942

----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     7 |  1449 |    10   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS BY INDEX ROWID| DAO_OBJECTS1   |     7 |  1449 |    10   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_OBJ_NAME_1 |    12 |       |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("OBJECT_ID"=51)
   2 - access("OBJECT_NAME"='I_CON1')

Note
-----
   - dynamic sampling used for this statement (level=2)


关联方式

USE_HASH


SQL> select  *
from dao_objects1 d1, dao_objects d2
where d1.object_id = d2.object_id
and rownum =1 ;  2    3    4


Execution Plan
----------------------------------------------------------
Plan hash value: 3282424980

----------------------------------------------------------------------------------------------
| Id  | Operation                     | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |              |     1 |   304 |     7   (0)| 00:00:01 |
|*  1 |  COUNT STOPKEY                |              |       |       |            |          |
|   2 |   NESTED LOOPS                |              |       |       |            |          |
|   3 |    NESTED LOOPS               |              |     3 |   912 |     7   (0)| 00:00:01 |
|   4 |     TABLE ACCESS FULL         | DAO_OBJECTS  |     3 |   291 |     2   (0)| 00:00:01 |
|*  5 |     INDEX RANGE SCAN          | IDX_OBJ_ID_1 |     1 |       |     1   (0)| 00:00:01 |
|   6 |    TABLE ACCESS BY INDEX ROWID| DAO_OBJECTS1 |     1 |   207 |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(ROWNUM=1)
   5 - access("D1"."OBJECT_ID"="D2"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)



SQL> select /*+ use_hash(d1 d2 ) */ *
from dao_objects1 d1, dao_objects d2
where d1.object_id = d2.object_id
and rownum =1 ;  2    3    4


Execution Plan
----------------------------------------------------------
Plan hash value: 1706612812

--------------------------------------------------------------------------------------------
| Id  | Operation           | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |              |     1 |   511 |       |  1471   (1)| 00:00:18 |
|*  1 |  COUNT STOPKEY      |              |       |       |       |            |          |
|*  2 |   HASH JOIN         |              | 74819 |    36M|  8040K|  1471   (1)| 00:00:18 |
|   3 |    TABLE ACCESS FULL| DAO_OBJECTS  | 75483 |  7150K|       |   302   (1)| 00:00:04 |
|   4 |    TABLE ACCESS FULL| DAO_OBJECTS1 | 74819 |    14M|       |     3  (34)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(ROWNUM=1)
   2 - access("D1"."OBJECT_ID"="D2"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)





USE_NL



SQL> select  *
from dao_objects1 d1, dao_objects d2
where d1.object_id = d2.object_id ;  2    3

Execution Plan
----------------------------------------------------------
Plan hash value: 3133027981

-------------------------------------------------------------------------------------------
| Id  | Operation          | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |              | 74819 |    21M|       |  1769   (1)| 00:00:22 |
|*  1 |  HASH JOIN         |              | 74819 |    21M|  8040K|  1769   (1)| 00:00:22 |
|   2 |   TABLE ACCESS FULL| DAO_OBJECTS  | 75483 |  7150K|       |   302   (1)| 00:00:04 |
|   3 |   TABLE ACCESS FULL| DAO_OBJECTS1 | 74819 |    14M|       |   301   (1)| 00:00:04 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("D1"."OBJECT_ID"="D2"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)
   
   
SQL> select /*+ use_nl(d1 d2 ) */ *
from dao_objects1 d1, dao_objects d2
where d1.object_id = d2.object_id ;  2    3

Execution Plan
----------------------------------------------------------
Plan hash value: 3367069654

---------------------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              | 74819 |    21M|   150K  (1)| 00:30:08 |
|   1 |  NESTED LOOPS                |              |       |       |            |          |
|   2 |   NESTED LOOPS               |              | 74819 |    21M|   150K  (1)| 00:30:08 |
|   3 |    TABLE ACCESS FULL         | DAO_OBJECTS  | 75483 |  7150K|   302   (1)| 00:00:04 |
|*  4 |    INDEX RANGE SCAN          | IDX_OBJ_ID_1 |     1 |       |     1   (0)| 00:00:01 |
|   5 |   TABLE ACCESS BY INDEX ROWID| DAO_OBJECTS1 |     1 |   207 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("D1"."OBJECT_ID"="D2"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)






USE_MERGE


SQL> select  *
from dao_objects1 d1, dao_objects d2
where d1.object_id = d2.object_id ;  2    3

Execution Plan
----------------------------------------------------------
Plan hash value: 3133027981

-------------------------------------------------------------------------------------------
| Id  | Operation          | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |              | 74819 |    21M|       |  1769   (1)| 00:00:22 |
|*  1 |  HASH JOIN         |              | 74819 |    21M|  8040K|  1769   (1)| 00:00:22 |
|   2 |   TABLE ACCESS FULL| DAO_OBJECTS  | 75483 |  7150K|       |   302   (1)| 00:00:04 |
|   3 |   TABLE ACCESS FULL| DAO_OBJECTS1 | 74819 |    14M|       |   301   (1)| 00:00:04 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("D1"."OBJECT_ID"="D2"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)
   
   

SQL> select /*+ use_merge(d1 d2 ) */ *
from dao_objects1 d1, dao_objects d2
where d1.object_id = d2.object_id ;  2    3

Execution Plan
----------------------------------------------------------
Plan hash value: 1838142143

-----------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              | 74819 |    21M|       |  3366   (1)| 00:00:41 |
|   1 |  MERGE JOIN                  |              | 74819 |    21M|       |  3366   (1)| 00:00:41 |
|   2 |   TABLE ACCESS BY INDEX ROWID| DAO_OBJECTS1 | 74819 |    14M|       |  1389   (1)| 00:00:17 |
|   3 |    INDEX FULL SCAN           | IDX_OBJ_ID_1 | 74819 |       |       |   182   (1)| 00:00:03 |
|*  4 |   SORT JOIN                  |              | 75483 |  7150K|    19M|  1977   (1)| 00:00:24 |
|   5 |    TABLE ACCESS FULL         | DAO_OBJECTS  | 75483 |  7150K|       |   302   (1)| 00:00:04 |
-----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("D1"."OBJECT_ID"="D2"."OBJECT_ID")
       filter("D1"."OBJECT_ID"="D2"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)
      

以上提示适用于普通连接,外连接,笛卡尔积连接(use_hash 不适用于笛卡尔积连接)

NO_USE_HASH



SQL> SELECT *
  FROM EMP , DEPT
  WHERE EMP.DEPTNO = DEPT.DEPTNO ;  2    3

Execution Plan
----------------------------------------------------------
Plan hash value: 615168685

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    14 |   784 |     7  (15)| 00:00:01 |
|*  1 |  HASH JOIN         |      |    14 |   784 |     7  (15)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| DEPT |     5 |    90 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")


SQL> SELECT /*+ NO_USE_HASH(EMP DEPT) */  *
  FROM EMP , DEPT
  WHERE EMP.DEPTNO = DEPT.DEPTNO ;  2    3

Execution Plan
----------------------------------------------------------
Plan hash value: 1407029907

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |    14 |   784 |     8  (25)| 00:00:01 |
|   1 |  MERGE JOIN         |      |    14 |   784 |     8  (25)| 00:00:01 |
|   2 |   SORT JOIN         |      |     5 |    90 |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| DEPT |     5 |    90 |     3   (0)| 00:00:01 |
|*  4 |   SORT JOIN         |      |    14 |   532 |     4  (25)| 00:00:01 |
|   5 |    TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
       filter("EMP"."DEPTNO"="DEPT"."DEPTNO")


NO_USE_MERGE


SQL> SELECT /*+ NO_USE_HASH(EMP DEPT)  NO_USE_MERGE(EMP DEPT) */  *
  FROM EMP , DEPT
  WHERE EMP.DEPTNO = DEPT.DEPTNO ;  2    3

Execution Plan
----------------------------------------------------------
Plan hash value: 4192419542

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    14 |   784 |    10   (0)| 00:00:01 |
|   1 |  NESTED LOOPS      |      |    14 |   784 |    10   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| DEPT |     5 |    90 |     3   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| EMP  |     3 |   114 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("EMP"."DEPTNO"="DEPT"."DEPTNO")


NO_USE_NL



SQL> select  *
from dao_objects1 d1, dao_objects d2
where d1.object_id = d2.object_id
and rownum =1 ;  2    3    4

Execution Plan
----------------------------------------------------------
Plan hash value: 3282424980

----------------------------------------------------------------------------------------------
| Id  | Operation                     | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |              |     1 |   304 |     7   (0)| 00:00:01 |
|*  1 |  COUNT STOPKEY                |              |       |       |            |          |
|   2 |   NESTED LOOPS                |              |       |       |            |          |
|   3 |    NESTED LOOPS               |              |     3 |   912 |     7   (0)| 00:00:01 |
|   4 |     TABLE ACCESS FULL         | DAO_OBJECTS  |     3 |   291 |     2   (0)| 00:00:01 |
|*  5 |     INDEX RANGE SCAN          | IDX_OBJ_ID_1 |     1 |       |     1   (0)| 00:00:01 |
|   6 |    TABLE ACCESS BY INDEX ROWID| DAO_OBJECTS1 |     1 |   207 |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(ROWNUM=1)
   5 - access("D1"."OBJECT_ID"="D2"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)


SQL> select /*+  no_use_nl(d1 d2) */ *
from dao_objects1 d1, dao_objects d2
where d1.object_id = d2.object_id
and rownum =1 ;  2    3    4

Execution Plan
----------------------------------------------------------
Plan hash value: 1706612812

--------------------------------------------------------------------------------------------
| Id  | Operation           | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |              |     1 |   511 |       |  1471   (1)| 00:00:18 |
|*  1 |  COUNT STOPKEY      |              |       |       |       |            |          |
|*  2 |   HASH JOIN         |              | 74819 |    36M|  8040K|  1471   (1)| 00:00:18 |
|   3 |    TABLE ACCESS FULL| DAO_OBJECTS  | 75483 |  7150K|       |   302   (1)| 00:00:04 |
|   4 |    TABLE ACCESS FULL| DAO_OBJECTS1 | 74819 |    14M|       |     3  (34)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(ROWNUM=1)
   2 - access("D1"."OBJECT_ID"="D2"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)

HASH_SJ




SQL> select *
  from dao_objects1
 where object_id in (select
                      deptno
                       from emp);
  2    3    4    5
Execution Plan
----------------------------------------------------------
Plan hash value: 232411586

---------------------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              |     3 |   630 |    10  (10)| 00:00:01 |
|   1 |  NESTED LOOPS                |              |       |       |            |          |
|   2 |   NESTED LOOPS               |              |     3 |   630 |    10  (10)| 00:00:01 |
|   3 |    SORT UNIQUE               |              |    14 |    42 |     3   (0)| 00:00:01 |
|   4 |     TABLE ACCESS FULL        | EMP          |    14 |    42 |     3   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN          | IDX_OBJ_ID_1 |     1 |       |     1   (0)| 00:00:01 |
|   6 |   TABLE ACCESS BY INDEX ROWID| DAO_OBJECTS1 |     1 |   207 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   5 - access("OBJECT_ID"="DEPTNO")

Note
-----
   - dynamic sampling used for this statement (level=2)


SQL> select *
  from dao_objects1
 where object_id in (select /*+ hash_sj */
                      deptno
                       from emp);
  2    3    4    5
Execution Plan
----------------------------------------------------------
Plan hash value: 70541257

-------------------------------------------------------------------------------------
| Id  | Operation            | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |              |     3 |   630 |   305   (1)| 00:00:04 |
|*  1 |  HASH JOIN RIGHT SEMI|              |     3 |   630 |   305   (1)| 00:00:04 |
|   2 |   TABLE ACCESS FULL  | EMP          |    14 |    42 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL  | DAO_OBJECTS1 | 74819 |    14M|   301   (1)| 00:00:04 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("OBJECT_ID"="DEPTNO")

Note
-----
   - dynamic sampling used for this statement (level=2)


NL_SJ


SQL> select *
from emp
where deptno in (select deptno
                   from dept) ;  2    3    4

Execution Plan
----------------------------------------------------------
Plan hash value: 230627304

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    14 |   574 |     7  (15)| 00:00:01 |
|*  1 |  HASH JOIN SEMI    |      |    14 |   574 |     7  (15)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| DEPT |     5 |    15 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("DEPTNO"="DEPTNO")

SQL> select *
from emp
where deptno in (select  /*+ nl_sj */ deptno
                   from dept)   2    3    4  ;

Execution Plan
----------------------------------------------------------
Plan hash value: 2069258075

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    14 |   574 |    20   (0)| 00:00:01 |
|   1 |  NESTED LOOPS SEMI |      |    14 |   574 |    20   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| DEPT |     5 |    15 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("DEPTNO"="DEPTNO")



MERGE_SJ



SQL> select *
from emp
where deptno in (select deptno
                   from dept) ;  2    3    4

Execution Plan
----------------------------------------------------------
Plan hash value: 230627304

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    14 |   574 |     7  (15)| 00:00:01 |
|*  1 |  HASH JOIN SEMI    |      |    14 |   574 |     7  (15)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| DEPT |     5 |    15 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("DEPTNO"="DEPTNO")


                   
SQL> select *
  from emp
 where deptno in (select /*+ merge_sj */
                   deptno
                    from dept);  2    3    4    5

Execution Plan
----------------------------------------------------------
Plan hash value: 492114260

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |    14 |   574 |     8  (25)| 00:00:01 |
|   1 |  MERGE JOIN SEMI    |      |    14 |   574 |     8  (25)| 00:00:01 |
|   2 |   SORT JOIN         |      |    14 |   532 |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
|*  4 |   SORT UNIQUE       |      |     5 |    15 |     4  (25)| 00:00:01 |
|   5 |    TABLE ACCESS FULL| DEPT |     5 |    15 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("DEPTNO"="DEPTNO")
       filter("DEPTNO"="DEPTNO")

                   

HASH_AJ


SQL> select *
  from emp e
 where not exists
 (select object_id
    from dao_objects1 d1
   where e.empno = d1.object_id);  2    3    4    5    6

Execution Plan
----------------------------------------------------------
Plan hash value: 87989786

-----------------------------------------------------------------------------------
| Id  | Operation          | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |              |    14 |   714 |    17   (0)| 00:00:01 |
|   1 |  NESTED LOOPS ANTI |              |    14 |   714 |    17   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP          |    14 |   532 |     3   (0)| 00:00:01 |
|*  3 |   INDEX RANGE SCAN | IDX_OBJ_ID_1 |     1 |    13 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("E"."EMPNO"="D1"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)


SQL> select *
  from emp e
 where not exists
 (select /*+ hash_aj */ object_id
    from dao_objects1 d1
   where e.empno = d1.object_id);  2    3    4    5    6

Execution Plan
----------------------------------------------------------
Plan hash value: 300146118

--------------------------------------------------------------------------------------
| Id  | Operation             | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |              |    14 |   714 |    55   (2)| 00:00:01 |
|*  1 |  HASH JOIN ANTI       |              |    14 |   714 |    55   (2)| 00:00:01 |
|   2 |   TABLE ACCESS FULL   | EMP          |    14 |   532 |     3   (0)| 00:00:01 |
|   3 |   INDEX FAST FULL SCAN| IDX_OBJ_ID_1 | 74819 |   949K|    51   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("E"."EMPNO"="D1"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)


NL_AJ



SQL> select *
  from dept
 where not exists (select 1
                     from emp
                    where dept.deptno = emp.empno);  2    3    4    5

Execution Plan
----------------------------------------------------------
Plan hash value: 474461924

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     5 |   110 |     7  (15)| 00:00:01 |
|*  1 |  HASH JOIN ANTI    |      |     5 |   110 |     7  (15)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| DEPT |     5 |    90 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| EMP  |    14 |    56 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("DEPT"."DEPTNO"="EMP"."EMPNO")




SQL> select *
  from dept
 where not exists (select /*+ nl_aj */ 1
                     from emp
                    where dept.deptno = emp.empno);
  2    3    4    5
Execution Plan
----------------------------------------------------------
Plan hash value: 1522491139

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     5 |   110 |    10   (0)| 00:00:01 |
|   1 |  NESTED LOOPS ANTI |      |     5 |   110 |    10   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| DEPT |     5 |    90 |     3   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| EMP  |     1 |     4 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("DEPT"."DEPTNO"="EMP"."EMPNO")


MERGE_AJ


SQL> select *
  from emp e
 where not exists
 (select object_id
    from dao_objects1 d1
   where e.empno = d1.object_id);  2    3    4    5    6

Execution Plan
----------------------------------------------------------
Plan hash value: 87989786

-----------------------------------------------------------------------------------
| Id  | Operation          | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |              |    14 |   714 |    17   (0)| 00:00:01 |
|   1 |  NESTED LOOPS ANTI |              |    14 |   714 |    17   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP          |    14 |   532 |     3   (0)| 00:00:01 |
|*  3 |   INDEX RANGE SCAN | IDX_OBJ_ID_1 |     1 |    13 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("E"."EMPNO"="D1"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)


SQL> select *
  from emp e
 where not exists
 (select /*+ MERGE_AJ */ object_id
    from dao_objects1 d1
   where e.empno = d1.object_id);  2    3    4    5    6

Execution Plan
----------------------------------------------------------
Plan hash value: 919708645

-----------------------------------------------------------------------------------------------
| Id  | Operation              | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |              |    14 |   714 |       |   415   (2)| 00:00:05 |
|   1 |  MERGE JOIN ANTI       |              |    14 |   714 |       |   415   (2)| 00:00:05 |
|   2 |   SORT JOIN            |              |    14 |   532 |       |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL   | EMP          |    14 |   532 |       |     3   (0)| 00:00:01 |
|*  4 |   SORT UNIQUE          |              | 74819 |   949K|  2952K|   411   (1)| 00:00:05 |
|   5 |    INDEX FAST FULL SCAN| IDX_OBJ_ID_1 | 74819 |   949K|       |    51   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("E"."EMPNO"="D1"."OBJECT_ID")
       filter("E"."EMPNO"="D1"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)




关联顺序

ordered

指定多表关联的关联顺序




SQL> select *
 from   dept d ,dao_objects1 d1 ,emp e
where e.deptno = d.deptno
  and e.empno = d1.object_id ;  2    3    4

Execution Plan
----------------------------------------------------------
Plan hash value: 4244767586

---------------------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              |    14 |  3682 |    35   (3)| 00:00:01 |
|   1 |  NESTED LOOPS                |              |       |       |            |          |
|   2 |   NESTED LOOPS               |              |    14 |  3682 |    35   (3)| 00:00:01 |
|*  3 |    HASH JOIN                 |              |    14 |   784 |     7  (15)| 00:00:01 |
|   4 |     TABLE ACCESS FULL        | DEPT         |     5 |    90 |     3   (0)| 00:00:01 |
|   5 |     TABLE ACCESS FULL        | EMP          |    14 |   532 |     3   (0)| 00:00:01 |
|*  6 |    INDEX RANGE SCAN          | IDX_OBJ_ID_1 |     1 |       |     1   (0)| 00:00:01 |
|   7 |   TABLE ACCESS BY INDEX ROWID| DAO_OBJECTS1 |     1 |   207 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("E"."DEPTNO"="D"."DEPTNO")
   6 - access("E"."EMPNO"="D1"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)



SQL> select /*+ ordered */ *
 from   dept d ,dao_objects1 d1 ,emp e
where e.deptno = d.deptno
  and e.empno = d1.object_id  ;  2    3    4

Execution Plan
----------------------------------------------------------
Plan hash value: 2457440359

--------------------------------------------------------------------------------------
| Id  | Operation             | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |              |    14 |  3682 |  1508   (1)| 00:00:19 |
|*  1 |  HASH JOIN            |              |    14 |  3682 |  1508   (1)| 00:00:19 |
|   2 |   TABLE ACCESS FULL   | EMP          |    14 |   532 |     3   (0)| 00:00:01 |
|   3 |   MERGE JOIN CARTESIAN|              |   374K|    80M|  1503   (1)| 00:00:19 |
|   4 |    TABLE ACCESS FULL  | DEPT         |     5 |    90 |     3   (0)| 00:00:01 |
|   5 |    BUFFER SORT        |              | 74819 |    14M|  1500   (1)| 00:00:18 |
|   6 |     TABLE ACCESS FULL | DAO_OBJECTS1 | 74819 |    14M|   300   (1)| 00:00:04 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("E"."DEPTNO"="D"."DEPTNO" AND "E"."EMPNO"="D1"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)




leading

指定表成为第一次关联中的驱动表


SQL> select /*+ leading( d1) */ *
 from   dept d ,dao_objects1 d1 ,emp e
where e.deptno = d.deptno
  and e.empno = d1.object_id  ;  2    3    4

Execution Plan
----------------------------------------------------------
Plan hash value: 3156926386

--------------------------------------------------------------------------------------------
| Id  | Operation           | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |              |    14 |  3682 |       |  1085   (1)| 00:00:14 |
|*  1 |  HASH JOIN          |              |    14 |  3682 |       |  1085   (1)| 00:00:14 |
|*  2 |   HASH JOIN         |              |    14 |  3430 |    15M|  1081   (1)| 00:00:13 |
|   3 |    TABLE ACCESS FULL| DAO_OBJECTS1 | 74819 |    14M|       |   301   (1)| 00:00:04 |
|   4 |    TABLE ACCESS FULL| EMP          |    14 |   532 |       |     3   (0)| 00:00:01 |
|   5 |   TABLE ACCESS FULL | DEPT         |     5 |    90 |       |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("E"."DEPTNO"="D"."DEPTNO")
   2 - access("E"."EMPNO"="D1"."OBJECT_ID")

Note
-----
   - dynamic sampling used for this statement (level=2)