生產庫常積累百個索引,多數從未使用或拖慢 DML。傳統做法直接 DROP 風險大:可能遺漏周期性作業、Hint 強制使用、外鍵鎖優化等隱性依賴。
ALTER INDEX pk_emp MONITORING USAGE;
ALTER INDEX ix_emp_sal MONITORING USAGE;
-- 經過一個業務週期後查詢
SELECT index_name, table_name, monitoring, used,
start_monitoring, end_monitoring
FROM v$object_usage;
USED = YES:曾被執行計劃採用。USED = NO:監控期間未被使用,候選刪除對象。CREATE INDEX ix_emp_sal ON emp(sal) INVISIBLE;
-- 或
ALTER INDEX ix_emp_sal INVISIBLE;
-- Session 級啟用
ALTER SESSION SET optimizer_use_invisible_indexes = TRUE;
-- Hint 強制使用(需參數為 TRUE 才生效)
SELECT /*+ INDEX(emp ix_emp_sal) */ ename FROM emp WHERE sal = 1500;
ALTER INDEX ix_emp_sal VISIBLE; -- 瞬間生效,無重建開銷
SELECT index_name, visibility FROM dba_indexes WHERE visibility = 'INVISIBLE';
MONITORING USAGE 覆蓋完整業務週期。USED = NO 者先設 INVISIBLE 觀察 1~2 週,無異常再 DROP。CREATE ... INVISIBLE,配合 optimizer_use_invisible_indexes 在測試/預發環境驗證執行計劃與效能。ALTER INDEX ... NOMONITORING USAGE;。