一、索引管理成本三大項
- 磁盤空間(索引段佔用);
- DML 維護開銷(INSERT/UPDATE/DELETE 需同步更新索引);
- 額外回滾段空間(索引變更產生 UNDO)。
二、DML 影響實測數據(1 萬行插入)
| 索引配置 | 平均耗時 | 增長率 |
| 無索引 | 2.9 秒 | 基線 |
| 單列索引 (A) | 6.7 秒 | +131% |
| 雙列索引 (A,B) | 10.3 秒 | +255% |
| 三列索引 (A,B,C) | 11.7 秒 | +303% |
結論:索引數量與 DML 耗時近似線性正相關,寫密集表嚴格控制索引個數。
三、按存儲分類
| 類型 | 結構特點 | 適用場景 | 避坑 |
| B*Tree | 分支塊+葉塊,類似書目錄,高扇出、平衡樹 | 高選擇性、OLTP 精確查找、唯一約束 | 低基數列(性別、狀態)建 B*Tree 極差 |
| Bitmap | 位圖偏移映射 ROWID,極度壓縮 | 低基數、DW 星型查詢、多條件 AND/OR 組合 | OLTP 高併發 DML 易產生鎖爭用/死鎖 |
四、按功能分類
- 唯一索引:約束+訪問雙重角色,每條記錄對應唯一 ROWID;
- 非唯一索引:純訪問加速;
- 函數索引:
CREATE INDEX idx_upper_name ON emp(UPPER(ename)),支援函數條件查詢;
- 反向鍵索引:
REVERSE 反轉鍵值分散熱塊,緩解右側增長熱點;
- 壓縮索引:
COMPRESS n 前綴壓縮,節省空間、提高緩存命中;
- 位圖連接索引:預連接維度表,星型查詢無需實時 JOIN。
五、索引選型決策樹
IF 查詢模式 = 精確點查/範圍掃描 AND 選擇性 > 1% THEN B*Tree
ELSE IF 查詢模式 = 多低基數列組合 AND 環境 = DW/報表 THEN Bitmap
ELSE IF 條件包含函數表達式 THEN Function-based Index
ELSE IF 主鍵/唯一約束 THEN Unique Index
ELSE 考慮全表掃描 + 並行
六、維護最佳實踐
- 定期
ANALYZE INDEX ... VALIDATE STRUCTURE 或 DBMS_STATS.GATHER_INDEX_STATS;
- 碎片化嚴重(
HEIGHT 增長、DEL_LF_ROWS 佔比高)→ ALTER INDEX ... REBUILD [ONLINE];
- 監控
V$SEGMENT_STATISTICS 索引掃描效率,長期未用索引果斷 DROP。
- 上一篇文章: Oracle 核心知識 25 條:表空間、控制文件、日志、塊、段、區、事務與實例關係
- 下一篇文章: Oracle DBA 日常運維規範:每日/每周/每月檢查清單與腳本化落地
Copyright ©
程式碼之家 All Rights Reserved