首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle SQL 性能調優 30 條黃金法則:從寫法到執行計劃的系統優化

     編輯:Oracle 資料庫相關知識

SQL 調優無銀彈,但有經驗總結的「黃金法則」。本文梳理 30 條高頻優化準則,覆蓋寫法規範、索引利用、解析優化、統計信息維護,附帶原理解析與反模式對比。

表連接與訪問路徑優化

  1. FROM 子句表序:RBO 下右至左解析,小表 (記錄少) 放最後作驅動表;CBO 依賴統計信息,但小表驅動大表原則仍有效
  2. WHERE 條件順序:自下而上解析,表連接條件優先,過濾性最強條件放最後
  3. 避免 SELECT *:解析階段需查數據字典展開列名,增加開銷
  4. 優先 TRUNCATE 替代 DELETE:不產生 Redo/Undo,不觸發 Trigger,高水位線重置,秒級完成
  5. 適時 COMMIT:釋放 Undo Segment、鎖、Redo Log Buffer、管理內存

索引利用與失效規避

  1. 列前綴別名:t.col 減少解析歧義與時間
  2. 大寫 SQL:Oracle 內部轉大寫再解析,小寫增加 CPU
  3. 索引列禁用 NOT:WHERE status != 'A' → 全表掃描
  4. 索引列禁用運算/函數:WHERE sal*12 > 25000 → 改 WHERE sal > 25000/12
  5. 用 >= 替代 >:deptno >= 4 直接定位;> 3 先定位 3 再掃描
  6. 避免索引列用 !=、||、+、IS NULL:均導致索引失效
  7. IN 子句慎用:內部排序合併,EXISTS 通常更快
  8. 雙索引列 OR 改 UNION:WHERE idx1=1 OR idx2=2 → WHERE idx1=1 UNION WHERE idx2=2
  9. IS NULL 破壞索引:單列索引不存 NULL,改 WHERE col >= 0 (數值型)

排序與集合操作優化

  1. DISTINCT/UNION/MINUS/INTERSECT/ORDER BY 觸發 SORT,消耗 PGA/Temp,能免則免
  2. 多列索引優先用導引列:複合索引 (A,B) 必須 WHERE 條件含 A 才生效
  3. UNION ALL 替代 UNION:免排序去重,業務允許重複時首選
  4. 禁用 TO_NUMBER 等隱式轉換:WHERE char_col = 123 → TO_NUMBER(char_col)=123 索引失效
  5. 字符型索引列必須加引號:col = '123' 而非 col = 123

進階寫法優化

  1. WHERE 替代 HAVING:HAVING 在分組後過濾,WHERE 分組前過濾,減少中間結果集
  2. 索引維護成本意識:DML 每行額外 4-5 次 I/O 維護索引,非高查詢表慎建索引
  3. 定期重建索引:ALTER INDEX idx REBUILD [ONLINE] 消除碎片、恢復聚簇因子
  4. NOT IN 改 NOT EXISTS:NOT IN 全表掃描子查詢,NOT EXISTS 滿足即返回
  5. MINUS 替代 NOT EXISTS:集合運算優化器處理更高效 (需測試驗證)
  6. 分析函數替代多次掃描:ROW_NUMBER() OVER (PARTITION BY ...) 單掃描完成多維聚合
  7. 外連接改寫 NOT EXISTS:WHERE b.key IS NULL 配合 (+) 或 ANSI LEFT JOIN
  8. NULL 值建函數索引:CREATE INDEX idx ON tab(NVL(col, 'NULL'))
  9. 避免索引列運算:或建函數索引 CREATE INDEX idx ON tab(UPPER(name))
  10. 慎用 LIKE:前導通配符 %abc 索引失效,等值優先
  11. 類型一致性:數值比數值、字符比字符,避免隱式轉換
  12. DECODE/CASE 減少表訪問:單掃描完成多條件分支
  13. 全表掃描非絕對惡:訪問超 30% 行、並行查詢、聚合操作時 FTS 更優
  14. GROUP BY 前置過濾:WHERE job IN ('A','B') GROUP BY job 優於 GROUP BY job HAVING job IN ('A','B')

工具輔助驗證

  • EXPLAIN PLAN + DBMS_XPLAN.DISPLAY
  • AUTOTRACE / SQL_TRACE + TKPROF
  • V$SQL_PLAN / DBA_HIST_SQL_PLAN (AWR)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved