為實現全表掃描
使用FTS的前提條件
使用全表掃描的例子
SQL> explain plan for select * from dual;
Query Plan
SELECT STATEMENT[CHOOSE] Cost=
TABLE ACCESS FULL DUAL
行的ROWID指出了該行所在的數據文件
這種存取方法不會用到多塊讀操作
使用ROWID存取的方法
SQL> explain plan for select * from dept where rowid =
Query Plan
SELECT STATEMENT [CHOOSE] Cost=
TABLE ACCESS BY ROWID DEPT [ANALYZED]
我們先通過index查找到數據對應的rowid值(對於非唯一索引可能返回多個rowid值)
在索引中
SQL> explain plan for select empno
Query Plan
SELECT STATEMENT [CHOOSE] Cost=
TABLE ACCESS BY ROWID EMP [ANALYZED]
INDEX UNIQUE SCAN EMP_I
但是如果查詢的數據能全在索引中找到
SQL> explain plan for select empno from emp where empno=
Query Plan
SELECT STATEMENT [CHOOSE] Cost=
INDEX UNIQUE SCAN EMP_I
進一步講
SQL> explain plan for select empno
where empno >
Query Plan
SELECT STATEMENT[CHOOSE] Cost=
TABLE ACCESS BY ROWID EMP [ANALYZED]
INDEX RANGE SCAN EMP_I
從這個例子中可以看到
根據索引的類型與where限制條件的不同
索引唯一掃描(index unique scan)
索引范圍掃描(index range scan)
索引全掃描(index full scan)
索引快速掃描(index fast full scan)
(
通過唯一索引查找一個數值經常返回單個ROWID
使用唯一性約束的例子
SQL> explain plan for
select empno
Query Plan
SELECT STATEMENT [CHOOSE] Cost=
TABLE ACCESS BY ROWID EMP [ANALYZED]
INDEX UNIQUE SCAN EMP_I
(
使用一個索引存取多行數據
使用索引范圍掃描的例子
SQL> explain plan for select empno
where empno >
Query Plan
SELECT STATEMENT[CHOOSE] Cost=
TABLE ACCESS BY ROWID EMP [ANALYZED]
INDEX RANGE SCAN EMP_I
在非唯一索引上
使用index rang scan的
(a) 在唯一索引列上使用了range操作符(> < <> >= <= between)
(b) 在組合索引上
(c) 對非唯一索引列上進行的任何查詢
(
與全表掃描對應
全索引掃描的例子
An Index full scan will not perform single block i/o
e
Index BE_IX is a concatenated index on big_emp (empno
SQL> explain plan for select empno
Query Plan
SELECT STATEMENT[CHOOSE] Cost=
INDEX FULL SCAN BE_IX [ANALYZED]
(
掃描索引中的所有的數據塊
索引快速掃描的例子
BE_IX索引是一個多列索引
big_emp (empno
SQL> explain plan for select empno
Query Plan
SELECT STATEMENT[CHOOSE] Cost=
INDEX FAST FULL SCAN BE_IX [ANALYZED]
只選擇多列索引的第
SQL> explain plan for select ename from big_emp;
Query Plan
SELECT STATEMENT[CHOOSE] Cost=
INDEX FAST FULL SCAN BE_IX [ANALYZED]
From:http://tw.wingwit.com/Article/program/Oracle/201311/17452.html