Ocacle執(zhí)行計(jì)劃與執(zhí)行順序的代碼示例
我們?nèi)绻胍私猓?a >Ocacle執(zhí)行計(jì)劃與執(zhí)行順序,就必須的理解Ocacle執(zhí)行計(jì)劃的關(guān)系。其實(shí)Ocacle執(zhí)行計(jì)劃的關(guān)系就好比父子關(guān)系,執(zhí)行計(jì)劃通俗的講,就是一個(gè)樹狀結(jié)構(gòu),頂層的STATEMENT是這棵樹的根。父子關(guān)系按照如下的樹狀結(jié)構(gòu)組織:
- PARENT
- FIRST CHILD
- SECOND CHILD
在這個(gè)例子里,F(xiàn)IRST 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í)的Ocacle執(zhí)行計(jì)劃來驗(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’);
- rows selected.
這個(gè)語句的執(zhí)行計(jì)劃如下:
- 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)
注意這個(gè)Ocacle執(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í)行。再來檢查ID=2的步驟:
2 1 TABLE ACCESS (FULL) OF ‘DEPT’ (Cost=1 Card=3 Bytes=36)
這個(gè)步驟是ID=1的步驟的子步驟,并且該步驟沒有任何子步驟。因此該步驟是這個(gè)SQL語句第一個(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è)語句中,是第二個(gè)被執(zhí)行的步驟。
ID=1的步驟將ID=3和ID=3的步驟的結(jié)果集進(jìn)行HASH 連接,然后把結(jié)果交給ID=0的步驟,就完成了本語句的執(zhí)行。
以上的相關(guān)內(nèi)容就是對(duì)Ocacle執(zhí)行計(jì)劃和執(zhí)行順序的內(nèi)容介紹,望你能有所收獲。
【編輯推薦】