执行计划和执行顺序
今天從http://www.oraclefans.cn/forum/showtopic.jsp?rootid=181&CPages=1看到一個關于執行計劃的東東,做個筆記,記錄下來,我也是從上面載來的。
如果要了解執行計劃和執行順序,必須理解執行計劃的父子關系。執行計劃是一個樹狀結構,頂層的STATEMENT是這棵樹的根。父子關系按照如下的樹狀結構組織:
PARENT FIRST?CHILD SECOND CHILD 在這個例子里,FIRST CHILD最先執行,然后是SECOND CHILD,這兩個步驟執行完畢后,執行PARENT。下面是一個更多層次的結構: PARENT1 FIRST?CHILD FIRST?GRANDCHILD SECOND CHILD FIRST?GRANDCHILD是第一個執行的步驟,然后是FIRST CHILD。下面通過一個真實的執行計劃來驗證這個原則: set autotrace traceonly explain select ename,dname?from emp, dept? where emp.deptno=dept.deptno? and dept.dname in (‘ACCOUNTING’,’RESEARCH’,’SALES’,’OPERATIONS’); 15 rows selected. 這個語句的執行計劃如下: Execution Plan ---------------------------------------------------------- ?? 0????? SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=8 Bytes=248) ?? 1??? 0?? HASH JOIN (Cost=3 Card=8 Bytes=248) ?? 2??? 1???? TABLE ACCESS (FULL) OF ‘DEPT’ (Cost=1 Card=3 Bytes=36) ?? 3??? 1???? TABLE ACCESS (FULL) OF ‘EMP’ (Cost=1 Card=16 Bytes=304) ? 注意這個執行計劃的最左邊的兩個列,第一個列是步驟的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的步驟,就完成了本語句的執行。轉載于:https://blog.51cto.com/qhd2004/285006
總結
- 上一篇: 编程小总结
- 下一篇: 用#ifndef、#define、#en