Oracle 10g數據庫查找數據的方法總結
我們知道,Oracle 10g數據庫提供了更強大的查找數據的方法,提高了查詢數據庫的效率。那么它是如何查找數據的呢?查找數據的方式有幾種呢?本文我們就來介紹這一部分內容,接下就讓我們來一起了解一下吧。
Oracle 10g 查找數據主要有以下方式:
全表掃描和ROWID查找數據
全表掃描(Full Table Scans ):
有時Oracle數據庫在評估***執行計劃時,當去取大量數據時,就會優先考慮使用全表掃描,因為這時全表掃描是***的。一般取出的數據占表的數據5%--10%左右會發生表掃描,一般在OLTP系統中盡量避免表掃描。
為了更好的使用表掃描,提高效率,在oracle 中有好幾種分區方法,提高表掃描的效率,讓表按具體業務邏輯來分區,盡量做到分區消除,減少表掃描的大小,提高性能。
ROWID查找數據(Table Access by ROWID 或R owid lookup ):
行ROWID是行數據在數據庫文件,數據塊和行在塊的具體位置,所以是Oracle最快的定位方法。
這種方法只能一次讀取一個IO,不會涉及多個IO。
目前通過索引查找,主要有5種索引查找方式:
- 索引唯一查找(index unique scan )
- 索引范圍查找 (index range scan )
- 索引全部掃描 (index full scan )
- 索引快速掃描 (index fast full scan )
- 索引跳躍式查找 (index skip scan )
通過索引查找數據
索引唯一查找(index unique scan ):
當查詢列是如果存在UNIQUE 或PRIMARY KEY 約束(它保證了語句只存取單行)的話,Oracle經常實現唯一性掃描。此查找方法效率很高。
索引范圍查找 (index range scan ):
使用一個索引存取多行數據,在唯一索引上使用索引范圍掃描的典型情況下是在謂詞(where限制條件)中使用了范圍操作符(如>、<、<>、>=、<=、between)。
索引全部掃描 (index full scan ):
全索引掃描。對查詢出的數據進行排序,而且此時查詢出的數據都必須從索引中可以直接得到。同時order by排序的數據應該是按索引的順序來讀取的。 如:explain plan for select empno,ename from big_emp order by empno,ename。
索引快速掃描 (index fast full scan ):
與index full scan很類似,但是一個顯著的區別就是它不對查詢出的數據進行排序,即數據不是以排序順序被返回 ,在這種存取方法中,可以使用多塊讀功能,也可以使用并行讀入,以便獲得***吞吐量與縮短執行時間,索引快速全局掃描,不帶order by情況下常發生,如:explain plan for select empno,ename from big_emp。
索引跳躍式查找(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個。
關于Oracle 10g查找數據的方式就介紹這么多了,希望本次的介紹能夠對您有所收獲!
【編輯推薦】