SQL 調優不是單一技巧的疊加,而是基於 Oracle 核心機制 (最佳化器、統計資訊、執行計畫、儲存引擎) 的系統性工程。本文彙整調優核心原則、手法間的衝突取捨、統計資訊時效性、Hint 使用紀律、持續調優機制,建立可落地的調優方法論。
所有調優手段的前提是 語義等價。任何改寫、Hint、索引建立、分區調整,必須經過完整回歸測試驗證結果集一致 (含 NULL 處理、排序順序、精度)。
| 層級 | 手法 | 適用時機 | 風險/成本 |
|---|---|---|---|
| L0 基礎 | 統計資訊收集 (DBMS_STATS) | 任何調優起點 | 低風險、高收益、必做 |
| 索引設計 (B-tree/Bitmap/Function-based/Composite) | WHERE/JOIN/ORDER BY 欄位有選擇性 | 寫入負擔、空間、維護窗口 | |
| SQL 改寫 (條件下推、去相關子查詢、UNION ALL 替代 UNION) | 邏輯可等價轉換 | 需嚴格測試語義 | |
| L1 進階 | 分區/分區索引 | 大表、時間序列、歸檔需求 | DDL 變更、應用相容性測試 |
| 物化視圖 / 結果快取 | 重複昂貴彙總查詢 | 資料新鮮度要求、快取失效策略 | |
| 平行查詢 / DML | 大量掃描、資料倉庫 | 資源爭用、並行度參數調校 | |
| Hint / Outline / SQL Plan Baseline / SQL Profile | 最佳化器持續選錯計畫 | 綁死計畫、升級風險、維護成本高 | |
| L2 架構 | 資料模型重構 (非正規化、預計算欄位、縱向/橫向分表) | 業務邏輯根本變更、極致效能 | 開發成本極高、遷移風險 |
| 硬體/參數調校 (SGA/PGA/IO/CPU/Exadata Smart Scan) | 系統級瓶頸 | 需 DBA/SA 協作、成本高 |
SQL Plan Baseline 而非硬編碼 Hint,升級時可演化 (EVOLVE)。PARTITION PRUNING 生效 (Execution Plan 顯示 PARTITION RANGE SINGLE/ITERATOR)。Resource Manager 限制平行度、指定消費者群組;ALTER SESSION DISABLE PARALLEL QUERY)。-- 1. 函數右移 / 避免索引欄位運算 -- ❌ WHERE TRUNC(hiredate) = TRUNC(SYSDATE) -- ✅ WHERE hiredate >= TRUNC(SYSDATE) AND hiredate < TRUNC(SYSDATE)+1 -- 2. 替換 IN / OR / <> / IS NOT NULL -- ❌ WHERE deptno IN (10,20,30) -- 可能全表掃描 -- ✅ WHERE deptno = 10 OR deptno = 20 OR deptno = 30 -- 或用 UNION ALL -- 3. 分解複雜 SQL (單責任原則) -- ❌ 單一巨大 SQL 包含 10+ JOIN、多層子查詢、CASE WHEN 巢狀 -- ✅ 拆解為 WITH 子查詢 / 暫存表 / 管線函數 / 多步驟 ETL -- 4. 避免 SELECT * / 只取需要欄位 -- ❌ SELECT * FROM big_table -- ✅ SELECT col1, col2, col3 FROM big_table -- 5. 使用 UNION ALL 替代 UNION (已知無重複或可接受重複) -- ❌ SELECT ... FROM a UNION SELECT ... FROM b -- ✅ SELECT ... FROM a UNION ALL SELECT ... FROM b -- 6. 將常數值下推至最內層 (Predicate Pushdown) -- ❌ 外層 WHERE filter_col = :val -- ✅ 內層子查詢/視圖定義直接加 WHERE filter_col = :val
AUTO_TASK_STATS 維護視窗收集;確認 SELECT * FROM DBA_AUTOTASK_CLIENT WHERE CLIENT_NAME='auto optimizer stats collection'; 狀態為 ENABLED。DBMS_STATS.GATHER_TABLE_STATS(ownname=>'SCOTT', tabname=>'EMP', granularity=>'PARTITION', cascade=>TRUE, method_opt=>'FOR ALL COLUMNS SIZE AUTO');DBMS_STATS.LOCK_TABLE_STATS 防止自動任務覆蓋。city, state) 建立 DBMS_STATS.CREATE_EXTENDED_STATS 提升基數估算。SQL Performance Analyzer (SPA) 或 DBMS_SQLPA 捕捉代表性 SQL 執行指標 (Elapsed Time, Buffer Gets, Disk Reads, Rows Processed)。DBMS_WORKLOAD_REPOSITORY)V$SQL_MONITOR 即時長跑 SQLDBA_HIST_SQLSTAT 歷史趨勢SQL Plan Baseline 驗收、SPA 比對、utPLSQL 單元測試。| 工具 | 用途 | 指令/入口 |
|---|---|---|
| EXPLAIN PLAN / AUTOTRACE | 單一 SQL 執行計畫分析 | SET AUTOTRACE TRACEONLY EXPLAIN |
| SQL Trace / TKPROF | 完整執行統計 (Parse/Execute/Fetch, Wait Events) | ALTER SESSION SET SQL_TRACE=TRUE; TKPROF trace.trc out.txt |
| DBMS_XPLAN.DISPLAY_CURSOR | 顯示實際執行計畫 (含 Runtime Stats) | SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(sql_id, child_no, 'ALLSTATS LAST')); |
| AWR / ASH | 系統級效能診斷、Top SQL 識別 | @?/rdbms/admin/awrrpt.sql / Enterprise Manager |
| SQL Tuning Advisor | 自動推薦索引、Profile、改寫 | DBMS_SQLTUNE / EM |
| SQL Plan Management (SPM) | 基線管理、演化、固定計畫 | DBMS_SPM |
建立「測量 → 分析 → 改寫/索引/分區 → 驗證 → 基線化 → 監控 → 迭代」的閉環流程,才是 Oracle SQL 效能調優的正確打開方式。