ORDER BY 子句只在兩種嚴格的條件下使用索引
ORDER BY中所有的列必須包含在相同的索引中並保持在索引中的排列順序
ORDER BY中所有的列必須定義為非空
WHERE子句使用的索引和ORDER BY子句中所使用的索引不能並列
例如:
表DEPT包含以下列:
DEPT_CODE PK NOT NULL
DEPT_DESC NOT NULL
DEPT_TYPE NULL
非唯一性的索引(DEPT_TYPE)
低效: (索引不被使用)
SELECT DEPT_CODE
FROM DEPT
ORDER BY DEPT_TYPE
EXPLAIN PLAN:
SORT ORDER BY
TABLE ACCESS FULL
高效: (使用索引)
SELECT DEPT_CODE
FROM DEPT
WHERE DEPT_TYPE >
EXPLAIN PLAN:
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON DEPT_IDX
ORDER BY 也能使用索引! 這的確是個容易被忽視的知識點
SQL> select * from emp order by empno;
Execution Plan
當比較不同數據類型的數據時
假設 EMPNO是一個數值類型的索引列
SELECT …
FROM EMP
WHERE EMPNO =
實際上
SELECT …
FROM EMP
WHERE EMPNO = TO_NUMBER(
幸運的是
現在
SELECT …
FROM EMP
WHERE EMP_TYPE =
這個語句被ORACLE轉換為:
SELECT …
FROM EMP
WHERE TO_NUMBER(EMP_TYPE)=
因為內部發生的類型轉換
為了避免ORACLE對你的SQL進行隱式的類型轉換
某些SELECT 語句中的WHERE子句不使用索引
在下面的例子裡
不使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT !=
使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT >
下面的例子中
不使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE ACCOUNT_NAME||ACCOUNT_TYPE=
使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE ACCOUNT_NAME =
AND ACCOUNT_TYPE=
下面的例子中
不使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT +
使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT >
下面的例子中
不使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE ACCOUNT_NAME = NVL(:ACC_NAME
使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME
如果一定要對使用函數的列啟用索引
CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基於函數的索引*/
SELECT * FROM emp WHERE UPPER(ename) =
From:http://tw.wingwit.com/Article/program/Oracle/201311/17864.html