在Oracle 10g有幾種尋找資料的方法,瞭解這些尋找資料的方法,有利於我們讀懂執行計畫,並通過執行計畫來最佳化我們的ORacle資料庫系統。尋找資料主要有以下方式:
全表掃描和RowId尋找資料
1.1 全表掃描(Full Table Scans)
有時Oracle資料庫在評估最優執行計畫時,當去取大量資料時,就會優先考慮使用全表掃描,因為這時全表掃描是最優的。一般取出的資料占表的資料5%--10%左右會發生表掃描,一般在OLTP系統中盡量避免表掃描。為了更好的使用表掃描,提高效率,在oracle 中有好幾種分區方法,提高表掃描的效率,讓表按具體商務邏輯來分區,盡量做到分區消除,減少表掃描的大小,提高效能。
1.2 ROWID尋找資料(Table Access by ROWID 或 Rowid lookup)
行ROWID是行資料在資料庫檔案,資料區塊和行在塊的具體位置,所以是Oracle最快的定位方法。這種方法只能一次讀取一個IO,不會涉及多個IO。
通過索引尋找資料
目前通過索引尋找,主要有5種索引尋找方式:
1.索引唯一尋找(index unique scan)
2.索引範圍尋找 (index range scan)
3.索引全部掃描 (index full scan)
4.索引快速掃描 (index fast full scan)
5.索引跳躍式尋找 (index skip scan)
2.1 索引唯一尋找(index unique scan)
當查詢列是 如果存在UNIQUE 或PRIMARY KEY 約束(它保證了語句只存取單行)的話,Oracle經常實現唯一性掃描。此尋找方法效率很高。
2.2 索引範圍尋找 (index range scan)
使用一個索引存取多行資料,在唯一索引上使用索引範圍掃描的典型情況下是在謂詞(where限制條件)中使用了範圍操作符(如>、<、<>、>=、<=、between)
2.3 索引全部掃描 (index full scan)
全索引掃描。對查詢出的資料進行排序,而且此時查詢出的資料都必須從索引中可以直接得到。同時order by排序的資料應該是按索引的順序來讀取的。 如下:explain plan for select empno,ename from big_emp order by empno,ename
2.4 索引快速掃描 (index fast full scan)
與 index full scan很類似,但是一個顯著的區別就是它不對查詢出的資料進行排序,即資料不是以排序次序被返回,在這種存取方法中,可以使用多塊讀功能,也可以使用並行讀入,以便獲得最大輸送量與縮短執行時間,索引快速全域掃描,不帶order by情況下常發生。如下:explain plan for select empno,ename from big_emp
2.5 索引跳躍式尋找 (index skip scan)
where條件列是非索引的前置列情況下常發生。如下:create index i_emp on emp(empno, ename); select /*+ index_ss(emp i_emp)*/ job from emp where ename='SMITH';
總結:
index full scan (索引全掃描):有排序,就是利用到了index的排序功能。原理:通過root根級----到中間級---葉級。
index fast full scan (索引快速掃描): 無排序,就可以利用多塊讀取方式,提高查詢速度,因為資料要求是無序的。即可以使用多塊查詢,取出的資料就是資料存放的順序。
當進行index full scan的時候 oracle定位到索引的root block,然後到branch block(如果有的話),再定位到第一個leaf block, 然後根據leaf block的雙向鏈表順序讀取。它所讀取的塊都是有順序的,也是經過排序的。而index fast full scan則不同,它是從段頭開始,讀取包含位元影像塊,root block,所有的branch block, leaf block,讀取的順序完全有實體儲存體位置決定,並採取多塊讀,每次讀取db_file_multiblock_read_count個