索引雖能加速查詢,但並非萬能良藥。錯誤的索引可能導致死鎖、效能暴跌、進程終止;正確的索引能讓原本跑數小時的作業在分鐘內完成。DBA必須認清其雙面性。
Oracle提供兩種存取路徑:
選擇性定義:符合條件的行數 / 總行數。選擇性越高(比例越低),索引效益越大。
設計原則:優先為高基數(高唯一性)欄位建立索引,如PK、UK、高辨識度業務欄位。
即使選擇性高,若符合條件的行分散在多個不連續區塊,索引需執行大量單區塊讀取,反而比多區塊讀取的全表掃描慢。
| 儲存情況 | 存取方式 | 效能 |
|---|---|---|
| 符合行集中在同幾個區塊 | 索引範圍掃描 + 少量單區塊讀 | 極快 |
| 符合行分散於大量區塊 | 索引掃描 + 大量單區塊讀 | 慢於全表掃描 |
DBA行動指南:
USER_INDEXES.CLUSTERING_FACTOR接近區塊數=好,接近行數=差黃金法則:「只有在查詢效能獲益明顯大於維護成本時,才建立索引」。定期審視USER_INDEXES與V$OBJECT_USAGE (監控索引使用情況),清除未被使用的索引。