首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle執行計劃樹狀結構解讀:父子節點執行順序規則

     編輯:Oracle 資料庫基礎

執行計劃樹形結構本質

Oracle執行計劃是一棵樹,根節點為SELECT STATEMENT。執行順序遵循後序遍歷:先執行所有子節點,再執行父節點。同級子節點按ID順序執行(First Child → Second Child)。

父子關係表示

PARENT (ID=0)
  FIRST CHILD (ID=1, Parent=0)
    FIRST GRANDCHILD (ID=2, Parent=1)  -- 最先執行
  SECOND CHILD (ID=3, Parent=1)        -- 第二執行
-- 最後執行 PARENT (ID=0)

實戰案例:雙表HASH JOIN

EXPLAIN PLAN FOR
SELECT ename, dname FROM emp, dept
WHERE emp.deptno = dept.deptno
AND dept.dname IN ('ACCOUNTING','RESEARCH','SALES','OPERATIONS');

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

輸出解讀

Id | Parent | Operation                    | Name | Cost
---|--------|------------------------------|------|-----
 0 |        | SELECT STATEMENT             |      |   3
 1 | 0      |   HASH JOIN                  |      |   3
 2 | 1      |     TABLE ACCESS FULL        | DEPT |   1
 3 | 1      |     TABLE ACCESS FULL        | EMP  |   1

執行順序推導

  1. ID=2:全表掃描DEPT(無子節點,最先執行,生成構建表)
  2. ID=3:全表掃描EMP(無子節點,第二執行,生成探測表)
  3. ID=1:HASH JOIN(消耗ID=2,3結果,構建哈希表並連接)
  4. ID=0:SELECT STATEMENT(輸出最終結果集)

關鍵列含義

  • Id:操作唯一標識
  • Parent:父操作ID
  • Operation:操作類型(TABLE ACCESS, INDEX, JOIN等)
  • Options:操作細節(FULL, BY INDEX ROWID, UNIQUE SCAN等)
  • Cost/Card/Bytes:優化器估算成本、基數、字節數

常見操作執行順序模式

父操作子操作執行順序說明
NESTED LOOPS外層表 → 內層表先驅動外表,每行探測內表
HASH JOINBuild輸入 → Probe輸入通常小表Build,大表Probe
MERGE JOIN左輸入排序 → 右輸入排序兩輸入獨立排序後合併
UNION ALL分支1 → 分支2 → ...按定義順序串行執行

進階分析技巧

  • 使用DBMS_XPLAN.DISPLAY_CURSOR(sql_id, child, 'ALLSTATS LAST')查看實際執行統計(A-Rows, A-Time)
  • 關注Starts列:操作被啟動次數,NL Join內表Starts=外表行數
  • Buffers反映邏輯讀,Reads反映物理讀
  • 對比E-Rows(估算)與A-Rows(實際)發現統計信息偏差
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved