某些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 =
下面的例子中
不使用索引
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT +
使用索引
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT >
下面的例子中
不使用索引
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE ACCOUNT_NAME = NVL(
使用索引
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE ACCOUNT_NAME LIKE NVL(
CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基於函數的索引*/
SELECT * FROM emp WHERE UPPER(ename) =
如果你對一個列和一組有限的值進行比較
舉例
SELECT *
FROM LODGING
WHERE MANAGER IN (
優化器可能將它轉換成以下形式
SELECT *
FROM LODGING
WHERE MANAGER =
當選擇執行路徑時
Explain Plan
SELECT STATEMENT Optimizer=CHOOSE
CONCATENATION
TABLE ACCESS (BY INDEX ROWID) OF LODGING
INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON
TABLE ACCESS (BY INDEX ROWID) OF LODGING
INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON
基於成本的優化器(CBO
如果索引有很高的選擇性
比如
如果索引的選擇性很低
a
b
帶有DISTINCT
例如
通常
提高GROUP BY 語句的效率
低效
SELECT JOB
FROM EMP
GROUP by JOB
HAVING JOB =
OR JOB =
高效
SELECT JOB
FROM EMP
WHERE JOB =
OR JOB =
使用日期是
例如
SELECT TO_DATE(
FROM DUAL;
Returns
SELECT TO_DATE(
FROM DUAL;
Returns
使用隱式的游標
使用較大的BUFFER(比如
ORACLE將盡可能地獲取你所指定的內存大小
作者可能犯了一個錯誤
關於EXPORT/IMPORT的優化
總是將你的表和索引建立在不同的表空間內(TABLESPACES)
From:http://tw.wingwit.com/Article/program/Oracle/201311/17849.html