明明建了索引,執行計劃卻走 Full Table Scan。依照以下十步排查,覆蓋 95% 索引失效場景。
SHOW PARAMETER optimizer_mode。若為 RULE 或統計資訊缺失導致 CBO 退化,索引可能被忽略。(a,b,c),查詢必須包含 a (或 a,b),否則索引無法使用。WHERE char_col = 123 → 內部 TO_NUMBER(char_col) 導致索引失效。統一使用 WHERE char_col = '123'。EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>'SCOTT', tabname=>'EMP', cascade=>TRUE); 定期收集。METHOD_OPT=>'FOR COLUMNS SIZE 254 sex'。COUNT(*)、WHERE col IS NULL (無索引) 不走索引。建立函數索引 CREATE INDEX idx_emp_nvl ON emp(NVL(deptno, -1)) 或強制 NOT NULL。SELECT /*+ INDEX(emp idx_emp_dept) */ * FROM emp WHERE deptno=10;-- 1. AUTOTRACE 快速看計劃
SET AUTOTRACE ON EXPLAIN
SELECT ...;
-- 2. TKPROF 深度分析
EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(sid, serial#, TRUE);
-- 跑完 SQL
tkprof trace.trc output.txt EXPLAIN=user/pass
SELECT /*+ INDEX(t idx_emp_dept) */ * FROM emp t WHERE deptno = 10;
-- 注意:/*+ 緊貼 SELECT,無空格
EXPLAIN PLAN 驗證索引使用情況。十步排查法,讓索引失效無處遁形。