skip_unusable_indexes (預設 TRUE) 控制遭遇 UNUSABLE 索引時的 SQL 執行行為:
ORA-01502 錯誤,DML 失敗-- 建立測試表與索引
CREATE TABLE t2 (sid INT NOT NULL, sname VARCHAR2(10)) TABLESPACE test;
BEGIN
FOR i IN 1..100000 LOOP INSERT INTO t2 VALUES (i, 'ocpyang'); END LOOP;
COMMIT;
END;
/
CREATE INDEX index_t2 ON t2(sid) TABLESPACE pindex;
-- 執行計畫基準:INDEX RANGE SCAN
SET AUTOTRACE ON EXPLAIN;
SELECT * FROM t2 WHERE sid < 10;
-- 設定索引 UNUSABLE
ALTER INDEX index_t2 UNUSABLE;
-- skip_unusable_indexes = TRUE (預設)
SELECT * FROM t2 WHERE sid < 10; -- 執行計畫轉為 TABLE ACCESS FULL
-- skip_unusable_indexes = FALSE
ALTER SYSTEM SET skip_unusable_indexes = FALSE;
SELECT * FROM t2 WHERE sid < 10; -- ORA-01502: index 'INDEX_T2' is in unusable state
| 狀態 | 操作 | Cost | 備註 |
|---|---|---|---|
| 索引正常 | INDEX RANGE SCAN → TABLE ACCESS BY INDEX ROWID | 3 | 最佳路徑 |
| UNUSABLE + TRUE | TABLE ACCESS FULL | 103 | 自動忽略壞索引,全表掃描 |
| UNUSABLE + FALSE | 錯誤 ORA-01502 | - | 查詢中止 |
DBA_INDEXES 篩選 STATUS = 'UNUSABLE',納入巡檢ALTER INDEX ... REBUILD (ONLINE 選項減少鎖定)ALTER INDEX ... REBUILD PARTITION ...optimizer_ignore_invalid_indexes (已棄用,12c+ 合併至 skip_unusable_indexes)_optimizer_skip_unusable_indexes (隱藏參數,勿手動修改)