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

Oracle SQL 調優核心四大法則:消除全表掃描、小表快取、最優索引/Join 與排序優化

     編輯:Oracle 資料庫相關知識

SQL 調優黃金目標

**最小化 I/O、最小化 CPU、最小化等待** — 所有技巧皆服務於此。

法則一:消除不必要的大表全表掃描 (FTS)

判斷標準

  • 有序表 (Index Organized / Clustered):回傳行數 < **40%** → 應用索引。
  • 無序表 (Heap Table):回傳行數 < **7%** → 應用索引。

對策工具箱

  1. 建立索引:B-Tree (高選擇度)、Bitmap (低選擇度/資料倉庫)、Function-Based (函數/運算式欄位)。
  2. Hint 強制索引:/*+ INDEX(t idx_name) */ — 臨時手段,根治靠統計資訊。
  3. 重寫 SQL:避免隱性轉換、NOT IN→NOT EXISTS、OR→UNION ALL、啟用 Partition Pruning。

法則二:小表全表掃描 → 快取化

版本語法機制
7/8iALTER TABLE small_tbl CACHE;放入 LRU 熱端 (MRU),但仍可能被淘汰
8i+ALTER TABLE small_tbl STORAGE (BUFFER_POOL KEEP);**KEEP Pool 永駐**,不被淘汰,**首選**
12c+INMEMORY PRIORITY HIGHIn-Memory Column Store,極致效能
**小表定義**:BLOCKS < _SMALL_TABLE_THRESHOLD (預設 ~2% Buffer Cache),通常 < 10,000 Blocks。

法則三:確保最優索引使用

  • 多索引競爭:檢查 V$SQL_PLAN 實際用哪個,必要時 /*+ INDEX(t idx_best) */ 或 INDEX_COMBINE。
  • Bitmap 索引:僅適合 **資料倉庫、低並發、多維度組合過濾** (星型查詢)。OLTP 會造成嚴重鎖競爭。
  • Function-Based Index:CREATE INDEX idx_upper_name ON emp(UPPER(ename)); 解決 WHERE UPPER(ename) = 'KING' 無法用索引。
  • Invisible Index (11g+):ALTER INDEX idx INVISIBLE; 測試新索引不影響現有計畫,驗證後 VISIBLE。

法則四:確保最優 Join 方法

Join 方法適用場景驅動條件Hint
Nested Loops小結果集驅動大表精準存取 (索引)外層行數少、內層有索引/*+ USE_NL(t1 t2) */
Hash Join大表關聯大表、無索引、等值連接記憶體足夠建 Hash Table (PGA)/*+ USE_HASH(t1 t2) */
Sort Merge Join大表關聯、非等值/範圍連接、已排序輸入雙方都需排序、或索引全掃描已有序/*+ USE_MERGE(t1 t2) */
**驅動表選擇**:CBO 依統計資訊估算輸出行數,**輸出行數少者為外層 (Driving/Outer)**。Hint 指定 LEADING(t1 t2) 強制順序。

排序優化專題

排序觸發場景

  • ORDER BY, GROUP BY, DISTINCT
  • CREATE INDEX, UNION (非 ALL), INTERSECT, MINUS
  • Join 缺索引退而求其次 SORT MERGE JOIN

記憶體 vs 磁碟排序

  • 記憶體排序:SORT_AREA_SIZE (手動) / PGA_AGGREGATE_TARGET (自動) 分配。**快 ~14,000 倍**。
  • 磁碟排序:超出記憶體 → Temp 表空間分頁。**極慢、佔 Temp、產生 I/O、推高 free buffer waits**。

排序優化清單

  1. 設定合理 PGA_AGGREGATE_TARGET (總 RAM 20~30%) + PGA_AGGREGATE_LIMIT (硬上限)。
  2. 避免不必要的 ORDER BY (應用層排序)、DISTINCT (改唯一索引/約束)。
  3. 大排序操作 (索引建立、大表 Group By) 設定 PARALLEL 分散壓力。
  4. 監控 V$SYSSTAT sorts (memory) vs sorts (disk),**磁碟排序比率 > 5% 即需調優**。

結語

SQL 調優無銀彈,**四大法則覆蓋 90% 場景**:消除大表 FTS、小表快取化、精準索引/Join、排序留在記憶體。建立 **SQL 基線庫 (SPM)**、自動化 **AWR/ASH Top SQL 審核機制**、開發階段 **EXPLAIN PLAN 強制審查**,將調優左移,讓資料庫永遠跑在最優路徑上。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved