| 特性 | EXPLAIN PLAN | SET AUTOTRACE |
|---|---|---|
| 是否執行 SQL | 否(僅解析) | 是(實際執行) |
| 適用場景 | DML 不想執行、生產環境只讀分析 | 完整效能分析、含實際統計 |
| 輸出內容 | 預估計畫、Cost、Cardinality | 實際計畫 + 邏輯讀/物理讀/排序/網路統計 |
| 權限需求 | PLUSTRACE role | PLUSTRACE role |
-- 1. 確保 PLAN_TABLE 存在(通常預設有公用同義詞)
-- 2. 產生計畫
EXPLAIN PLAN FOR
SELECT e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;
-- 3. 顯示計畫(需執行一次)
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
SET AUTOTRACE TRACEONLY EXPLAIN -- 僅顯示計畫,不執行(同 EXPLAIN PLAN)
SET AUTOTRACE TRACEONLY STATISTICS -- 僅顯示統計,不顯示資料
SET AUTOTRACE TRACEONLY -- 計畫 + 統計,不顯示資料(推薦)
SET AUTOTRACE ON -- 計畫 + 統計 + 結果集
-- 實際範例
SET AUTOTRACE TRACEONLY
SELECT * FROM dept, emp WHERE emp.deptno = dept.deptno;
Execution Plan
----------------------------------------------------------
Plan hash value: 1234567890
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0| SELECT STATEMENT | | 14 | 728 | 5 (20)| 00:00:01 |
| 1| NESTED LOOPS | | 14 | 728 | 5 (20)| 00:00:01 |
| 2| TABLE ACCESS FULL| EMP | 14 | 448 | 3 (34)| 00:00:01 |
| 3| TABLE ACCESS BY | DEPT | 1 | 20 | 1 (0)| 00:00:01 |
| 4| INDEX UNIQUE SCAN| PK_DEPT | 1 | | 0 (0)| 00:00:01 |
---------------------------------------------------------------------------
Statistics
----------------------------------------------------------
0 recursive calls
2 db block gets
30 consistent gets
0 physical reads
0 redo size
2598 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
INDEX UNIQUE SCAN → Id 3 TABLE ACCESS BY INDEX ROWIDTABLE ACCESS FULL EMP → Id 4/3 鏈NESTED LOOPS 串流連接 Id 2 與 Id 3/4 的結果TABLE ACCESS FULL EMP(Id 2)全表掃描 EMP,產生 14 列驅動資料INDEX UNIQUE SCAN PK_DEPT(Id 4)對每筆 EMP 的 DEPTNO 走 PK 索引查 DEPTTABLE ACCESS BY INDEX ROWID DEPT(Id 3)由 Rowid 取 DEPT 列資料NESTED LOOPS(Id 1)將兩邊結果逐列連接,輸出最終結果NESTED LOOPS 特例:驅動表(外層)通常是 Id 較小的子節點(此處 Id 2)。Oracle 11g+ 會在計畫顯示
NESTED LOOPS下分NESTED LOOPS OUTER等細節,但核心邏輯不變。
| Operation | 含義 | 效能暗示 |
|---|---|---|
TABLE ACCESS FULL | 全表掃描 | 大表需檢視是否缺索引/統計過期 |
TABLE ACCESS BY INDEX ROWID | 索引回表 | 正常;若次數極大考慮覆蓋索引 |
INDEX UNIQUE SCAN | 唯一索引單值查找 | 極佳(PK/UK 查找) |
INDEX RANGE SCAN | 索引範圍掃描 | 良好(範圍查詢、複合索引前綴) |
INDEX FULL SCAN | 索引全掃描 | 次於 RANGE SCAN,排序/全索引掃描 |
INDEX FAST FULL SCAN | 索引快速全掃(多區塊讀) | 類似 FTS 但僅讀索引,適合 COUNT(*) |
HASH JOIN | 雜湊連接 | 大表連接優選,需足夠 PGA |
SORT GROUP BY | 排序分組 | 大量排序關注 TEMP 空間 |
-- 基本顯示
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 含別名、成本、基數、位元組
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', NULL, 'TYPICAL'));
-- 含 Outline Hint(可直接複製成 Hint 固定計畫)
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', NULL, 'ADVANCED'));
-- 含實際執行統計(需先執行 SQL,配合 GATHER_PLAN_STATISTICS Hint)
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM emp WHERE deptno = 20;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));
圖形化介面提供:
命令列
AUTOTRACE+DBMS_XPLAN.DISPLAY_CURSOR是 DBA 隨身利器,無需安裝客戶端即可在伺服器端完成 90% 分析工作。
掌握 SET AUTOTRACE TRACEONLY 獲取實際計畫與統計,配合 DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST') 深度剖析,**核心能力在於「由內而外、由上而下」還原真實執行順序**,識別 FULL SCAN、CARDINALITY 嚴重偏差、NESTED LOOPS 驅動表選擇不當等效能殺手。建議將「執行計畫閱讀」列入 DBA/開發核心技能矩陣定期演練。