索引能加速查詢,但每次 DML 都需同步維護所有索引,索引過多反拖垮寫入效能。本文歸納五大「不宜建立索引」場景、多表 JOIN 索引設計、更新與查詢平衡點判斷,助您制定精準索引策略。
AD_Table、稽核日誌表。僅建立表層級索引(PK/UK),不建立欄位級次要索引。id_card_no 常用 WHERE id_card_no IS NULL 查詢未建檔員工 → 建 Bitmap 索引(支援 NULL)。last_login_time、account_balance。每次更新皆觸發索引維護,評估「查詢加速收益」是否大於「寫入延遲成本」。status='ACTIVE' 佔 99%,查詢通常針對 'INACTIVE'。此欄位建索引效果差,改用 CASE WHEN 函數索引或部分索引(12c+)。(join_col, filter_col) 讓單一索引同時服務 JOIN 與 WHERE 過濾。| 表特性 | 索引策略 | 典型範例 |
|---|---|---|
| 以查詢為主、更新極少 | 多建次要索引、複合索引、Bitmap | 報表表、資料倉庫維度表、歷史明細表 |
| 更新頻繁、查詢較少 | 僅保留 PK/UK/FK 必要索引 | 交易流水表、即時庫存表、Session 狀態表 |
| 混合負載 | 核心查詢路徑建索引,其餘靠 SQL Profile/Plan Baseline 優化 | 訂單主表、客戶主檔 |
WHERE/JOIN/ORDER BY 中?否則候選刪除。DBMS_STATS.GATHER_TABLE_STATS 並檢視 USER_INDEXES.LAST_ANALYZED。索引設計是「減法藝術」:從業務查詢模式反推必要索引,刪除其餘。定期審視 V$OBJECT_USAGE(監控索引使用情況),勇於刪除長期未用索引,才能維持系統長期健康。