| 方式 | 是否執行 SQL | 適用場景 | 權限要求 |
|---|---|---|---|
| EXPLAIN PLAN FOR | 否 | DML/DDL 風險語句、生產只讀分析 | 需 PLAN_TABLE 權限 |
| SET AUTOTRACE TRACEONLY EXPLAIN | 是 (但不顯示結果) | 快速交互分析、含綁定變量 | 需 PLUSTRACE 角色 |
| DBMS_XPLAN.DISPLAY_CURSOR | 需先執行 | 生產實際執行計劃 (含適應性計劃) | SELECT_CATALOG_ROLE |
| 第三方工具 | 否 | 圖形化、計劃對比、歷史追蹤 | 工具連接權限 |
-- 1. 創建計劃表 (每用戶一次)
@?/rdbms/admin/utlxplan.sql
-- 或手工
CREATE TABLE plan_table (...) ; -- 見 utlxplan.sql
-- 2. 生成計劃
EXPLAIN PLAN SET STATEMENT_ID = 'test_001' FOR
SELECT /*+ LEADING(e) */ e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND e.sal > 2000;
-- 3. 顯示計劃
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'test_001', 'ALL'));
-- 或簡化
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 一次性設置 (需 SYS 執行)
@?/rdbms/admin/utlxplan.sql
@?/sqlplus/admin/plustrce.sql
GRANT PLUSTRACE TO PUBLIC;
-- 使用
SET AUTOTRACE TRACEONLY EXPLAIN
SELECT * FROM emp WHERE deptno = 10;
-- 輸出計劃 + 統計 (不顯示數據)
-- 關閉
SET AUTOTRACE OFF
⚠️ 警告:AUTOTRACE 會真實執行 SQL,嚴禁對 UPDATE/DELETE/MERGE 使用,否則修改數據!
-- 1. 開啟統計收集
ALTER SESSION SET STATISTICS_LEVEL = ALL;
-- 2. 運行目標 SQL (可帶綁定變量)
VAR b_deptno NUMBER;
EXEC :b_deptno := 10;
SELECT /*+ GATHER_PLAN_STATISTICS */ e.ename
FROM emp e
WHERE e.deptno = :b_deptno;
-- 3. 顯示最後一條游標的實際計劃
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT => 'ALLSTATS LAST'));
關鍵列:E-Rows (估算行) vs A-Rows (實際行) — 偏差大 = 統計信息失準/綁定窺探問題。
| Operation | 含義 | 優化方向 |
|---|---|---|
| TABLE ACCESS FULL | 全表掃描 | 建索引、分區裁剪、並行查詢 |
| INDEX RANGE SCAN | 索引範圍掃描 | 檢查選擇性、避免隱式轉換 |
| INDEX UNIQUE SCAN | 唯一索引查找 | 最優單行訪問 |
| HASH JOIN / MERGE JOIN | 大表連接 | 小表驅動大表、調整 JOIN ORDER |
| NESTED LOOPS | 小結果集連接 | 驅動表有高選擇性索引 |
| SORT GROUP BY / ORDER BY | 排序 | 索引消除排序、增加 SORT_AREA_SIZE |
| PX SEND / PX RECEIVE | 並行執行 | 檢查 DOP、Granule 劃分 |
+ 標記的備選操作,EXPLAIN PLAN 只顯示默認。