過度索引是 DML 變慢主因:每筆 INSERT/UPDATE/DELETE 皆需同步維護所有索引。許多 DBA 見 WHERE 條件有欄位就建索引,導致關鍵表索引過剩,嚴重拖垮寫入效能。
9i 引入 ALTER INDEX ... MONITORING USAGE,配合 V$OBJECT_USAGE 即可識別長期未被使用的索引。
SET PAGES 999 HEADING OFF
SPOOL run_monitor.sql
SELECT 'ALTER INDEX '||owner||'.'||index_name||' MONITORING USAGE;'
FROM dba_indexes
WHERE owner NOT IN ('SYS','SYSTEM','PERFSTAT');
SPOOL OFF
@run_monitor
SELECT index_name, table_name, monitoring, used
FROM v$object_usage
WHERE used = 'NO';
USED=NO 即為候選刪除對象(不提供使用次數,但足夠定性)。
ALTER INDEX ... NOMONITORING USAGE;(釋放少量共用池記憶體)。DBA_INDEX_USAGE(需診斷包授權)獲取更豐富統計。V$SEGMENT_STATISTICS 看索引讀寫比,精準決策。