我們如果想要了解,Ocacle執行計劃與執行順序,就必須的理解Ocacle執行計劃的關系。其實Ocacle執行計劃的關系就好比父子關系,執行計劃通俗的講,就是一個樹狀結構,頂層的STATEMENT是這棵樹的根。父子關系按照如下的樹狀結構組織:
- PARENT
- FIRST CHILD
- SECOND CHILD
在這個例子裡,FIRST CHILD最先執行,然後是SECOND CHILD,這兩個步驟執行完畢後,執行PARENT。下面是一個更多層次的結構:
- PARENT1
- FIRST CHILD
- FIRST GRANDCHILD
- SECOND CHILD
FIRST GRANDCHILD是第一個執行的步驟,然後是FIRST CHILD。下面通過一個真實的Ocacle執行計劃來驗證這個原則:
- set autotrace traceonly explain
- select ename,dname from emp, dept
- where emp.deptno=dept.deptno
- and dept.dname in
- (‘ACCOUNTING’,’RESEARCH’,’SALES’,’OperaTIONS’);
- rows selected.
這個語句的執行計劃如下:
- Execution Plan
- SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=8 Bytes=248)
- HASH JOIN (Cost=3 Card=8 Bytes=248)
- TABLE Access (FULL) OF ‘DEPT’ (Cost=1 Card=3 Bytes=36)
- TABLE Access (FULL) OF ‘EMP’ (Cost=1 Card=16 Bytes=304)
注意這個Ocacle執行計劃的最左邊的兩個列,第一個列是步驟的ID,第二個列是父步驟的ID。執行從ID=0的行開始:
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=8 Bytes=248)
這個步驟沒有父步驟,有一個子步驟(ID=1),所以這個ID=1的步驟必須在執行步驟0之前執行。繼續觀察ID=1的步驟:
1 0 HASH JOIN (Cost=3 Card=8 Bytes=248)
這個步驟是ID=0的步驟的子步驟,該步驟有2個子步驟:ID=2和ID=3,因此ID=2和ID=3的步驟必須在ID=1的步驟之前執行。再來檢查ID=2的步驟:
2 1 TABLE Access (FULL) OF ‘DEPT’ (Cost=1 Card=3 Bytes=36)
這個步驟是ID=1的步驟的子步驟,並且該步驟沒有任何子步驟。因此該步驟是這個SQL語句第一個執行的步驟,這個步驟產生的結果集會提供給ID=1的步驟。這個步驟是對表DEPT進行全表掃描,這個步驟的COST=1。
ID=1的步驟也依賴ID=3的步驟:
3 1 TABLE Access (FULL) OF ‘EMP’ (Cost=1 Card=16 Bytes=304)
這個步驟是ID=1的步驟的第二個子步驟,沒有任何子步驟,在這個語句中,是第二個被執行的步驟。
ID=1的步驟將ID=3和ID=3的步驟的結果集進行HASH 連接,然後把結果交給ID=0的步驟,就完成了本語句的執行。