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)
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
| 父操作 | 子操作執行順序 | 說明 |
|---|---|---|
| NESTED LOOPS | 外層表 → 內層表 | 先驅動外表,每行探測內表 |
| HASH JOIN | Build輸入 → 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(實際)發現統計信息偏差