索引能加速查詢,但濫用會拖垮寫入效能、佔用空間、甚至誤導優化器。本文歸納四大常見誤區與對應解法,並補充「索引失效/重建」運維技巧,助您建立精準索引策略。
| 誤區 | 現象 | 根因 | 解法 |
|---|---|---|---|
| 1. 聚合函數不走索引 | COUNT(1)、AVG/SUM/MIN/MAX(col) 全表掃描 | 索引含 NULL 值,聚合需掃描所有列;COUNT(*) 更不走索引 | COUNT(col) 無解;AVG/SUM/MIN/MAX 加 WHERE col IS NOT NULL 可觸發 INDEX FAST FULL SCAN |
| 2. MIN/MAX 同查不走索引 | SELECT MIN(col), MAX(col) FROM t 全表掃描 | 優化器未將雙聚合合併為雙索引掃描 | 拆分兩條查詢:SELECT MIN(col) FROM t WHERE col IS NOT NULL / SELECT MAX(col) FROM t WHERE col IS NOT NULL,各自走索引 |
| 3. 回表存取 | 查詢非索引欄位產生 TABLE ACCESS BY INDEX ROWID | 索引未覆蓋查詢欄位 | 若非必要勿查非索引欄位;必要時建立覆蓋索引 (Composite Index 含所有查詢欄位) |
| 4. 索引越多越好 | INSERT/UPDATE/DELETE 變慢、空間暴增 | 每個索引皆需同步維護;重複索引 (單欄+組合首欄相同) 浪費資源 | 定期檢視 DBA_INDEXES、V$OBJECT_USAGE (監控用法);若組合索引首欄 = 單欄索引,評估移除單欄索引 |
-- 1. 設為 UNUSABLE (停用,不刪除定義)
ALTER INDEX idx_name UNUSABLE;
-- 或分區索引
ALTER INDEX idx_name MODIFY PARTITION p202401 UNUSABLE;
-- 2. 執行大量載入/刪除/更新
-- ... 大批次 DML ...
-- 3. 重建索引 (線上可用 ONLINE)
ALTER INDEX idx_name REBUILD ONLINE;
-- 分區
ALTER INDEX idx_name REBUILD PARTITION p202401 ONLINE;
優點:避免 DML 時索引維護開銷;重建後統計資訊自動收集 (10g+),索引高度優化。
注意:UNUSABLE 期間查詢不可用該索引,應用需配合 (如切換至全表掃描 Hint)。
V$SESSION_LONGOPS 追蹤重建進度。INDEX (a,b,c) 支援 WHERE a=...、WHERE a=... AND b=...、WHERE a=... AND b=... AND c=...。CREATE INDEX idx_upper_name ON emp(UPPER(ename)) 支援 WHERE UPPER(ename) = 'KING'。DBMS_STATS.GATHER_TABLE_STATS(..., CASCADE=>TRUE) 同步更新索引統計。