SQL> list
  1  SELECT *
  2  FROM dept, emp
  3* WHERE emp.deptno = dept.deptno
SQL> set autotrace traceonly /*traceonly 可以不显示执行结果*/
SQL> /
14 rows selected.
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   NESTED LOOPS
   2    1     TABLE ACCESS (FULL) OF 'EMP' 
   3    1     TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
   4    3       INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
 
Statistics
----------------------------------------------------------
          0  recursive calls
          2  db block gets
         30  consistent gets
          0  physical reads
          0  redo size
       2598  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         14  rows processed
通过以上分析,可以得出实际的执行步骤是:
1.       TABLE ACCESS (FULL) OF 'EMP' 
2.       INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
3.       TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
4.       NESTED LOOPS (JOINING 1 AND 3)
怎么样才可以看出执行步骤是这样的呀?

解决方案 »

  1.   

    0      SELECT STATEMENT Optimizer=CHOOSE               --ok!
       1    0   NESTED LOOPS                                  --nested
       2    1     TABLE ACCESS (FULL) OF 'EMP'                --3:full scan
       3    1     TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'     --2:rowid scan
       4    3       INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE) --1:index scan
      

  2.   

    我也不太会读这个分析结果,bzszp的说明是什么意思呢?我知道一个简单的查看执行计划步骤的办法是在oracle 的 enterprise manager console里面对每个sql都可以查看其计划,点击下一步就可以自动跳到那一步去。具体就是双击一个会话,弹出的窗口中选“sql”tab栏
      

  3.   

    0      SELECT STATEMENT Optimizer=CHOOSE                 --这是最后一步,得结果
       1    0   NESTED LOOPS                                    --这是第四步,nested
       2    1     TABLE ACCESS (FULL) OF 'EMP'                  --这是第三步,全表扫描
       3    1     TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'       --这是第二步,通过ROWID访问表
       4    3       INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)   --这是第一步,先index scan
      

  4.   

    一般情况都是倒读这个顺序的,
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   NESTED LOOPS
       2    1     TABLE ACCESS (FULL) OF 'EMP' 
       3    1     TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
       4    3       INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)但不知道为什么书上写的顺序是这样的:“
    通过以上分析,可以得出实际的执行步骤是:
    1.       TABLE ACCESS (FULL) OF 'EMP' 
    2.       INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
    3.       TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
    4.       NESTED LOOPS (JOINING 1 AND 3) ”
    所以我才不明白!难道是人家写错了,但是写的错的话,这样的顺序也太离普了吧!
      

  5.   

    书上写得也没什么问题
    TABLE ACCESS (FULL) OF 'EMP' 

    INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
    属于最先执行的操作