熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle索引掃描的四種類型

2013-11-13 15:33:13  來源: Oracle 

  根據索引的類型與where限制條件的不同種類型的Oracle索引掃描

  ()       索引唯一掃描(index unique scan)

  ()       索引范圍掃描(index range scan)

  ()       索引全掃描(index full scan)

  ()       索引快速掃描(index fast full scan)

  一 索引唯一掃描(index unique scan)

  通過唯一索引查找一個數值經常返回單個ROWID如果該唯一索引有多個列組成(即組合索引)則至少要有組合索引的引導列參與到該查詢中如創建一個索引create index idx_test on emp(ename deptno loc)則select ename from emp where ename = JACK and deptno = DEV語句可以使用該索引如果該語句只返回一行則存取方法稱為索引唯一掃描而select ename from emp where deptno = DEV語句則不會使用該索引因為where子句種沒有引導列如果存在UNIQUE 或PRIMARY KEY 約束(它保證了語句只存取單行)的話Oracle經常實現唯一性掃描

  如

  SQL> set autot traceonly exp;   只顯示執行計劃

  SQL> select * from scottemp t where tempno=;

  執行計劃

  

  Plan hash value:

  

  | Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time

  

  |   | SELECT STATEMENT            |        |     |    |        ()| :

  |   |  TABLE ACCESS BY INDEX ROWID| EMP    |     |    |        ()| :

  |*  |   INDEX UNIQUE SCAN         | PK_EMP |     |       |        ()| :

  

  Predicate Information (identified by operation id):

  

   access(TEMPNO=)

  二.索引范圍掃描(index range scan)

  使用一個索引存取多行數據同上面一樣如果索引是組合索引而且select ename from emp where ename = JACK and deptno = DEV語句返回多行數據雖然該語句還是使用該組合索引進行查詢可此時的存取方法稱為索引范圍掃描

  在唯一索引上使用索引范圍掃描的典型情況下是在謂詞(where限制條件)中使用了范圍操作符(如><<>>=<=between)

  使用索引范圍掃描的例子

  SQL> select empnoename from scottemp  where empno > order by empno;

  執行計劃

  

  Plan hash value:

  

  | Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time

  

  |   | SELECT STATEMENT            |        |     |    |        ()| :

  |   |  TABLE ACCESS BY INDEX ROWID| EMP    |     |    |        ()| :

  |*  |   INDEX RANGE SCAN          | PK_EMP |     |       |        ()| :

  

  Predicate Information (identified by operation id):

  

   access(EMPNO>)

  在非唯一索引上謂詞可能返回多行數據所以在非唯一索引上都使用索引范圍掃描

  使用index rang scan的種情況

  (a) 在唯一索引列上使用了range操作符(> < <> >= <= between)

  (b) 在組合索引上只使用部分列進行查詢導致查詢出多行

  (c) 對非唯一索引列上進行的任何查詢

  三.索引全掃描(index full scan)

  與全表掃描對應也有相應的全Oracle索引掃描在某些情況下可能進行全Oracle索引掃描而不是范圍掃描需要注意的是全Oracle索引掃描只在CBO模式下才有效 CBO根據統計數值得知進行全Oracle索引掃描比進行全表掃描更有效時才進行全Oracle索引掃描而且此時查詢出的數據都必須從索引中可以直接得到

  全Oracle索引掃描的例子

  SQL> create index big_emp on scottemp(empnoename);

  索引已創建

  SQL> select empno ename from scottemp order by empnoename;

  執行計劃

  

  Plan hash value:

  

  | Id  | Operation        | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

  

  |   | SELECT STATEMENT |         |    |   |        ()| :: |

  |   |  INDEX FULL SCAN | BIG_EMP |    |   |        ()| :: |

  

  四. 索引快速掃描(index fast full scan)

  掃描索引中的所有的數據塊與 index full scan很類似但是一個顯著的區別就是它不對查詢出的數據進行排序即數據不是以排序順序被返回在這種存取方法中可以使用多塊讀功能也可以使用並行讀入以便獲得最大吞吐量與縮短執行時間

  索引快速掃描的例子

  SQL> select /*+ index_ffs(dave index_dave) */ id from dave where id>;

  執行計劃

  

  Plan hash value:

  

  | Id  | Operation            | Name       | Rows  | Bytes | Cost (%CPU)| Time

  

  |   | SELECT STATEMENT     |            |     |    |        ()| ::

  |*  |  INDEX FAST FULL SCAN| INDEX_DAVE |     |    |        ()| ::

  

  Predicate Information (identified by operation id):

  

   filter(ID>)

  為了實現這個效果折騰了半天最終還是用hint來了


From:http://tw.wingwit.com/Article/program/Oracle/201311/16906.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.