明明建了索引,執行計畫卻走 Full Table Scan?本文整理七大導致索引失效的典型模式與對應解法。
OPTIMIZER_MODE=ALL_ROWS 傾向全掃描。init.ora 為 RULE 或 CHOOSE,或用 Hint /*+ FIRST_ROWS */。DBMS_STATS.GATHER_TABLE_STATS 定期收集。INDEX SKIP SCAN 條件嚴格,通常不會觸發。SELECT COUNT(*) 不會使用該索引(B-tree 不存 NULL)。COUNT(1) 或建立函數索引 CREATE INDEX idx ON t(NVL(col,0))。WHERE UPPER(name)='ABC'、WHERE sal+100>2000。CREATE INDEX idx ON t(UPPER(name)) 或改寫條件。WHERE char_col = 123 觸發 TO_NUMBER(char_col)=123。WHERE TRUNC(dt)=TRUNC(SYSDATE)。WHERE dt >= TRUNC(SYSDATE) AND dt < TRUNC(SYSDATE)+1。並非所有情況用索引都比 Full Scan 快(Full Scan 採多區塊讀取)。先優化 SQL、收集統計、確認選擇率,證實索引確實更快後再用 Hint 強制。