建立索引雖簡單,但要達到「適當的表、適當的欄位、適當的數量」三個適當,卻是考驗 DBA 功力的關鍵。盲目建立索引不僅無法提升效能,反而會拖垮寫入效能、增加維護成本。本文系統梳理索引優化的三大決策維度。
如部門表僅百筆資料,全表掃描在記憶體中瞬間完成,索引帶來的 I/O 減少微乎其微,卻須付出 DML 維護、空間佔用成本。經驗值:資料筆數 < 1,000 或區塊數 < 50 時,全表掃描通常更優。
並非所有大表都適合建索引。關鍵在於常用查詢回傳資料佔全表比例:
驗證方法:對比 EXPLAIN PLAN 中 FULL TABLE SCAN 與 INDEX RANGE SCAN 的 Cost,或實測執行時間。
僅 DBA 偶爾查詢、寫入頻繁、查詢範圍通常為近期資料 → 不建立索引,改用分區表按時間管理更高效。
JOIN ON dept_id)。status = 'ACTIVE'),若非 NULL 值佔比低可考慮部分索引(Function-based Index: CASE WHEN status='ACTIVE' THEN id END)。last_update_time),索引維護成本極高。套裝軟體上線初期的索引設計,隨資料量增長、查詢模式變更可能失效。建議每半年審視 V$OBJECT_USAGE(監控索引使用率)、DBA_HIST_SQLSTAT(高負載 SQL),廢棄未用索引、補齊缺漏索引。
| 系統類型 | 特性 | 索引策略 |
|---|---|---|
| 資料倉庫/決策支援 | 大量查詢、批次載入、極少異動 | 索引多無妨,載入前 Disable Index,載入後 Rebuild |
| OLTP 交易系統 | 高頻 INSERT/UPDATE/DELETE | 極度克制:僅核心查詢路徑建索引,嚴禁過度索引 |
| 混合負載 | 查詢與寫入並重 | 依 V$SEGMENT_STATISTICS 觀察 logical reads vs physical writes 找平衡點 |
USER_INDEXES、USER_IND_COLUMNS 盤點現有索引。ALTER INDEX ... MONITORING USAGE 觀察 1-2 週實際使用情況。DROP 或 UNUSABLE。EXPLAIN PLAN 對比,上線後持續監控。索引優化是動態平衡的藝術。遵循「適當的表、適當的欄位、適當的數量」,輔以定期監控與業務驅動的調整,才能讓索引真正成為效能加速器而非負擔。記住:最好的索引,是被精準使用的索引。