程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Ocacle執行計劃與執行順序的代碼示例

Ocacle執行計劃與執行順序的代碼示例

編輯:Oracle數據庫基礎

我們如果想要了解,Ocacle執行計劃與執行順序,就必須的理解Ocacle執行計劃的關系。其實Ocacle執行計劃的關系就好比父子關系,執行計劃通俗的講,就是一個樹狀結構,頂層的STATEMENT是這棵樹的根。父子關系按照如下的樹狀結構組織:

  1. PARENT   
  2. FIRST CHILD   
  3. SECOND CHILD   

在這個例子裡,FIRST CHILD最先執行,然後是SECOND CHILD,這兩個步驟執行完畢後,執行PARENT。下面是一個更多層次的結構:

  1. PARENT1   
  2. FIRST CHILD   
  3. FIRST GRANDCHILD   
  4. SECOND CHILD   

FIRST GRANDCHILD是第一個執行的步驟,然後是FIRST CHILD。下面通過一個真實的Ocacle執行計劃來驗證這個原則:

  1. set autotrace traceonly explain   
  2. select ename,dname from emp, dept   
  3. where emp.deptno=dept.deptno   
  4. and dept.dname in  
  5. (‘ACCOUNTING’,’RESEARCH’,’SALES’,’OperaTIONS’);   
  6. rows selected.   

這個語句的執行計劃如下:

  1. Execution Plan  
  2. SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=8 Bytes=248)   
  3. HASH JOIN (Cost=3 Card=8 Bytes=248)   
  4. TABLE Access (FULL) OF ‘DEPT’ (Cost=1 Card=3 Bytes=36)   
  5. 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的步驟,就完成了本語句的執行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved