基礎表(Driving Table)是指被最先訪問的表(通常以全表掃描的方式被訪問)
如果你使用的是CBO (COST BASED OPTIMIZER)
如果你用RBO (RULE BASED OPTIMIZER)
舉例
SELECT A
FROM WORKER A
LODGING B
WHERE A
由於LODGING表的LODING列上有一個索引
當SQL語句的執行路徑可以使用分布在多個表上的多個索引時
在ORACLE選擇執行路徑時
如果不同表中兩個想同等級的索引將被引用
如果相同表中兩個想同等級的索引將被引用
舉例
DEPTNO上有一個非唯一性索引
SELECT ENAME
FROM EMP
WHERE DEPT_NO =
AND EMP_CAT =
這裡
TABLE ACCESS BY ROWID ON EMP
AND
INDEX RANGE SCAN ON DEPT_IDX
INDEX RANGE SCAN ON CAT_IDX
當WHERE子句中有索引列
舉例
DEPTNO上有一個非唯一性索引
SELECT ENAME
FROM EMP
WHERE DEPTNO >
AND EMP_CAT =
這裡只有EMP_CAT索引被用到
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON CAT_IDX
當ORACLE無法判斷索引的等級高低差別
舉例
DEPTNO上有一個非唯一性索引
SELECT ENAME
FROM EMP
WHERE DEPTNO >
AND EMP_CAT >
這裡
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON DEPT_IDX
譯者按
SQL> select index_name
INDEX_NAME UNIQUENES
EMPNO UNIQUE
EMPTYPE NONUNIQUE
SQL> select * from emp where empno >=
no rows selected
Execution Plan
雖然EMPNO是唯一性索引
如果兩個或以上索引具有相同的等級
舉例
SELECT ENAME
FROM EMP
WHERE EMPNO =
AND DEPTNO +
AND EMP_TYPE ||
這是一種相當直接的提高查詢效率的辦法
這裡有一個例子關於何時采用這種策略
假設在EMP表的EMP_TYPE列上有一個非唯一性的索引而EMP_CLASS上沒有索引
SELECT ENAME
FROM EMP
WHERE EMP_TYPE =
AND EMP_CLASS =
優化器會注意到EMP_TYPE上的索引並使用它
用下面的方案就可以解決問題
SELECT ENAME
FROM EMP
WHERE EMP_TYPE =
AND EMP_CLASS||
From:http://tw.wingwit.com/Article/program/Oracle/201311/17299.html