执行计划和执行顺序
今天從http://www.oraclefans.cn/forum/showtopic.jsp?rootid=181&CPages=1看到一個(gè)關(guān)于執(zhí)行計(jì)劃的東東,做個(gè)筆記,記錄下來(lái),我也是從上面載來(lái)的。
如果要了解執(zhí)行計(jì)劃和執(zhí)行順序,必須理解執(zhí)行計(jì)劃的父子關(guān)系。執(zhí)行計(jì)劃是一個(gè)樹狀結(jié)構(gòu),頂層的STATEMENT是這棵樹的根。父子關(guān)系按照如下的樹狀結(jié)構(gòu)組織:
PARENT FIRST?CHILD SECOND CHILD 在這個(gè)例子里,FIRST CHILD最先執(zhí)行,然后是SECOND CHILD,這兩個(gè)步驟執(zhí)行完畢后,執(zhí)行PARENT。下面是一個(gè)更多層次的結(jié)構(gòu): PARENT1 FIRST?CHILD FIRST?GRANDCHILD SECOND CHILD FIRST?GRANDCHILD是第一個(gè)執(zhí)行的步驟,然后是FIRST CHILD。下面通過一個(gè)真實(shí)的執(zhí)行計(jì)劃來(lái)驗(yàn)證這個(gè)原則: 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. 這個(gè)語(yǔ)句的執(zhí)行計(jì)劃如下: 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) ? 注意這個(gè)執(zhí)行計(jì)劃的最左邊的兩個(gè)列,第一個(gè)列是步驟的ID,第二個(gè)列是父步驟的ID。執(zhí)行從ID=0的行開始: 0????? SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=8 Bytes=248) 這個(gè)步驟沒有父步驟,有一個(gè)子步驟(ID=1),所以這個(gè)ID=1的步驟必須在執(zhí)行步驟0之前執(zhí)行。繼續(xù)觀察ID=1的步驟: 1??? 0?? HASH JOIN (Cost=3 Card=8 Bytes=248) 這個(gè)步驟是ID=0的步驟的子步驟,該步驟有2個(gè)子步驟:ID=2和ID=3,因此ID=2和ID=3的步驟必須在ID=1的步驟之前執(zhí)行。再來(lái)檢查ID=2的步驟: 2??? 1???? TABLE ACCESS (FULL) OF ‘DEPT’ (Cost=1 Card=3 Bytes=36) 這個(gè)步驟是ID=1的步驟的子步驟,并且該步驟沒有任何子步驟。因此該步驟是這個(gè)SQL語(yǔ)句第一個(gè)執(zhí)行的步驟,這個(gè)步驟產(chǎn)生的結(jié)果集會(huì)提供給ID=1的步驟。這個(gè)步驟是對(duì)表DEPT進(jìn)行全表掃描,這個(gè)步驟的COST=1。 ID=1的步驟也依賴ID=3的步驟: 3??? 1???? TABLE ACCESS (FULL) OF ‘EMP’ (Cost=1 Card=16 Bytes=304) 這個(gè)步驟是ID=1的步驟的第二個(gè)子步驟,沒有任何子步驟,在這個(gè)語(yǔ)句中,是第二個(gè)被執(zhí)行的步驟。 ID=1的步驟將ID=3和ID=3的步驟的結(jié)果集進(jìn)行HASH 連接,然后把結(jié)果交給ID=0的步驟,就完成了本語(yǔ)句的執(zhí)行。轉(zhuǎn)載于:https://blog.51cto.com/qhd2004/285006
總結(jié)
- 上一篇: 编程小总结
- 下一篇: 用#ifndef、#define、#en