SQL 語句效能決定系統回應速度。本文蒐羅實戰驗證的調優鐵律:WHERE 條件順序、SELECT * 危害、索引使用六大忌諱、EXISTS/UNION 改寫、ORDER BY 技巧、排序操作避免、WHERE 替代 HAVING、子查詢消除,並附執行計畫分析方法論。
ID = ?) 寫在最後面| # | 陷阱 | 失效範例 | 修正寫法 |
|---|---|---|---|
| 1 | 索引欄位用 NOT | WHERE status != 'A' | WHERE status IN ('B','C','D') 或改用位圖索引 |
| 2 | 索引欄位做運算/函數 | WHERE sal * 12 > 25000 | WHERE sal > 25000/12 |
| 3 | IS NULL / IS NOT NULL | WHERE dept_code IS NOT NULL | WHERE dept_code >= 0 (若非負) |
| 4 | LIKE 導模糊查詢 | WHERE dept_code LIKE '%123%' | WHERE dept_code = '123' 或功能性索引 |
| 5 | 隱式型別轉換發生在索引欄 | WHERE emp_type = 123 (emp_type 是 CHAR) | WHERE emp_type = '123' 或 TO_CHAR(123) |
| 6 | 資料量超 30% 表大小 | 大範圍掃描 | 全表掃描反而更快 |
-- 低效
SELECT DISTINCT d.dept_no, d.dept_name
FROM dept d, emp e
WHERE d.dept_no = e.dept_no AND e.sex = 'M';
-- 高效
SELECT d.dept_no, d.dept_name
FROM dept d
WHERE EXISTS (
SELECT 'X' FROM emp e
WHERE e.dept_no = d.dept_no AND e.sex = 'M'
);
EXISTS 滿足即停止掃描,避免排序去重。
-- 低效:OR 導致全表掃描
SELECT loc_id, loc_desc, region FROM location
WHERE loc_id = 10 OR region = 'MELBOURNE';
-- 高效:UNION ALL 合併兩個索引掃描
SELECT loc_id, loc_desc, region FROM location WHERE loc_id = 10
UNION ALL
SELECT loc_id, loc_desc, region FROM location WHERE region = 'MELBOURNE';
前提:loc_id、region 皆有索引。若有欄位無索引,OR 可能更好。
SORT_AREA_SIZE-- 低效:非索引欄位排序
SELECT dept_code FROM dept ORDER BY dept_type;
-- 高效:索引欄位排序 (可避免排序操作)
SELECT dept_code FROM dept ORDER BY dept_code;
DISTINCT:1 次排序UNION, MINUS, INTERSECT:至少 2 次排序SORT_AREA_SIZE 調優良好,可接受;否則改寫-- 低效:分組後再過濾
SELECT job, AVG(sal) FROM emp
GROUP BY job
HAVING job = 'PRESIDENT' AND AVG(sal) > 5000;
-- 高效:分組前過濾
SELECT job, AVG(sal) FROM emp
WHERE job IN ('PRESIDENT','MANAGER')
GROUP BY job
HAVING AVG(sal) > 5000;
EXPLAIN PLAN FOR SELECT ...;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 或即時計畫 (需權限)
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(sql_id, child_number, 'ALL'));
| 指標 | 關注點 |
|---|---|
| Operation | FULL TABLE SCAN vs INDEX RANGE SCAN vs NESTED LOOPS |
| Cost | 相對成本,非絕對時間 |
| Cardinality (Rows) | 預估行數,與 Actual 對比驗證統計資訊 |
| Bytes | 資料量,影響記憶體/臨時表空間 |
| Predicate Information | ACCESS vs FILTER 謂詞,判斷索引使用效率 |
| Note | Dynamic Sampling, Star Transformation, Adaptive Plan 等提示 |