索引選擇性 = 不重複鍵值數 / 表總行數,是評估索引效能的黃金指標。本文提供三種互補的測量方法,滿足不同業務場景需求。
SELECT i.distinct_keys / t.num_rows
FROM user_indexes i, user_tables t
WHERE i.table_name = '表名'
AND i.index_name = '索引名'
AND i.table_name = t.table_name;
SELECT column_name, num_distinct
FROM user_tab_columns
WHERE table_name = '表名';
單欄選擇性 = num_distinct / 表總行數。注意:此法無法精確測量多欄組合選擇性,需輔以手工測量或建立複合索引後分析。
SELECT COUNT(DISTINCT col_a || '%' || col_b) / COUNT(*)
FROM table_name;
頻繁DML操作導致索引葉子行刪除產生碎片,增加I/O成本。建立標準化檢測重建機制至關重要。
VALIDATE INDEX 用戶名.索引名;
此命令將統計資訊寫入INDEX_STATS表(單一資料列,每次驗證覆蓋)。
SELECT name,
del_lf_rows,
lf_rows,
ROUND((del_lf_rows / (lf_rows + 0.0000000001)) * 100) "Frag Percent"
FROM index_stats;
| 碎片比率 | 處理策略 | 語法範例 |
|---|---|---|
| > 10% | 重建索引(推薦) | ALTER INDEX 用戶名.索引名 REBUILD TABLESPACE 表空間名 STORAGE(INITIAL 初始值 NEXT 擴展值) NOLOGGING; |
| 5%-10% | 整理索引(節省空間) | ALTER INDEX 用戶名.索引名 COALESCE; |
| < 5% | 暫不處理,持續監控 | — |
ANALYZE INDEX 用戶名.索引名 DELETE STATISTICS;
NOLOGGING減少Redo生成ONLINE重建避免鎖定影響DBMS_STATS.GATHER_INDEX_STATS建立「監測-評估-執行-驗證」閉環機制,結合選擇性分析與碎片管理,可使索引長期維持最佳存取效能。實務證據顯示,規範化索引維護可提升核心查詢效能30%-50%以上。