SQL 調優的起點是**理解 Oracle 如何執行你的語句**:掃描方式(全表/索引)、Join 順序/方法、預估成本。AUTOTRACE 是 SQL*Plus 內建、零安裝的輕量分析工具。
CONNECT / AS SYSDBA
@?/rdbms/admin/utlxplan.sql -- 建立 PLAN_TABLE
CREATE PUBLIC SYNONYM PLAN_TABLE FOR PLAN_TABLE;
GRANT SELECT, INSERT, UPDATE, DELETE ON PLAN_TABLE TO PUBLIC;
@?/sqlplus/admin/plustrce.sql -- 建立 PLUSTRACE ROLE
GRANT PLUSTRACE TO PUBLIC; -- 讓普通用戶能用 AUTOTRACE
| 命令 | 輸出內容 | 適用場景 |
|---|---|---|
| 執行計畫 + 統計資訊 + 查詢結果 | 完整分析 | |
| 執行計畫 + 統計資訊,**不顯示結果** | 大結果集、只看計畫 | |
| **僅執行計畫(不實際執行)**,無統計 | 快速看計畫、DML 不想真改資料 |
SET AUTOTRACE TRACEONLY EXPLAIN
SET TIMING ON
SET LINESIZE 200
SET PAGESIZE 1000
SELECT e.ENAME, d.DNAME
FROM EMP e, DEPT d
WHERE e.DEPTNO = d.DEPTNO
AND e.SAL > 2000;
Execution Plan
----------------------------------------------------------
Plan hash value: 1234567890
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 5 | 200 | 3 (0) | 00:00:01 |
| 1 | HASH JOIN | | 5 | 200 | 3 (0) | 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 14 | 350 | 1 (0) | 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPT | 4 | 80 | 1 (0) | 00:00:01 |
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
12 consistent gets
0 physical reads
0 redo size
543 bytes sent via SQL*Net to client
432 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
5 rows processed
DBMS_STATS.GATHER_TABLE_STATS。consistent gets:邏輯讀(記憶體),**越小越好**。physical reads:物理讀(磁碟),應為 0 或極小。sorts (disk):磁碟排序,出現即需調大 PGA_AGGREGATE_TARGET 或優化 SQL。AUTOTRACE 顯示的是**預估計畫**;實際執行可能不同(Bind Variable Peeking、Adaptive Plan)。
-- 1. 執行目標 SQL(含 Bind 變數)
VARIABLE b_deptno NUMBER;
EXEC :b_deptno := 10;
SELECT * FROM EMP WHERE DEPTNO = :b_deptno;
-- 2. 立即顯示該游標實際計畫
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT => 'ALL +OUTLINE +PEEKED_BINDS'));
輸出包含:**Peeked Binds 值、Outline Data(HINT 全集)、Actual Rows/Time (含 STATISTICS_LEVEL=ALL)**。
| 現象 | 檢查方向 |
|---|---|
| FULL TABLE SCAN 大表 | 缺索引、統計過期、隱式轉換(TO_CHAR/TO_DATE)、OR 條件、函數索引欄位 |
| HASH JOIN 但記憶體不足 | 調大 PGA、檢查 Join Key 型別一致、考慮 NESTED LOOPS |
| Cost 巨大但 Rows 少 | 統計資訊錯誤 → 重新收集統計、直方圖 |
| Physical Reads 高 | 緩存不足、索引未命中、大表全掃 |
| Sorts (Disk) > 0 | ORDER BY/GROUP BY/DISTINCT 大結果集 → 增大 PGA、用索引避免排序 |