SQL優化常用方法30

inzaghi1984發表於2017-12-15
  1. 不明確的索引等級
    當ORACLE無法判斷索引的等級高低差別,優化器將只使用一個索引,它就是在WHERE子句中被列在最前面的.

舉例: DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.
SELECT ENAME FROM EMP WHERE DEPTNO > 20 AND EMP_CAT > ‘A`;
這裡, ORACLE只用到了DEPT_NO索引. 執行路徑如下:
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON DEPT_IDX
譯者按: 我們來試一下以下這種情況:
SQL> select index_name, uniqueness from user_indexes where table_name = `EMP`;
INDEX_NAME UNIQUENES
—————————— ———
EMPNO UNIQUE
EMPTYPE NONUNIQUE
SQL> select * from emp where empno >= 2 and emp_type = `A` ;
no rows selected

Execution Plan

0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF `EMP`
2 1 INDEX (RANGE SCAN) OF `EMPTYPE` (NON-UNIQUE)
雖然EMPNO是唯一性索引,但是由於它所做的是範圍比較, 等級要比非唯一性索引的等式比較低!


相關文章