Oracle 10g數(shù)據(jù)庫(kù)查找數(shù)據(jù)的方法總結(jié)
我們知道,Oracle 10g數(shù)據(jù)庫(kù)提供了更強(qiáng)大的查找數(shù)據(jù)的方法,提高了查詢數(shù)據(jù)庫(kù)的效率。那么它是如何查找數(shù)據(jù)的呢?查找數(shù)據(jù)的方式有幾種呢?本文我們就來(lái)介紹這一部分內(nèi)容,接下就讓我們來(lái)一起了解一下吧。
Oracle 10g 查找數(shù)據(jù)主要有以下方式:
全表掃描和ROWID查找數(shù)據(jù)
全表掃描(Full Table Scans ):
有時(shí)Oracle數(shù)據(jù)庫(kù)在評(píng)估***執(zhí)行計(jì)劃時(shí),當(dāng)去取大量數(shù)據(jù)時(shí),就會(huì)優(yōu)先考慮使用全表掃描,因?yàn)檫@時(shí)全表掃描是***的。一般取出的數(shù)據(jù)占表的數(shù)據(jù)5%--10%左右會(huì)發(fā)生表掃描,一般在OLTP系統(tǒng)中盡量避免表掃描。
為了更好的使用表掃描,提高效率,在oracle 中有好幾種分區(qū)方法,提高表掃描的效率,讓表按具體業(yè)務(wù)邏輯來(lái)分區(qū),盡量做到分區(qū)消除,減少表掃描的大小,提高性能。
ROWID查找數(shù)據(jù)(Table Access by ROWID 或R owid lookup ):
行ROWID是行數(shù)據(jù)在數(shù)據(jù)庫(kù)文件,數(shù)據(jù)塊和行在塊的具體位置,所以是Oracle最快的定位方法。
這種方法只能一次讀取一個(gè)IO,不會(huì)涉及多個(gè)IO。
目前通過(guò)索引查找,主要有5種索引查找方式:
- 索引唯一查找(index unique scan )
- 索引范圍查找 (index range scan )
- 索引全部掃描 (index full scan )
- 索引快速掃描 (index fast full scan )
- 索引跳躍式查找 (index skip scan )
通過(guò)索引查找數(shù)據(jù)
索引唯一查找(index unique scan ):
當(dāng)查詢列是如果存在UNIQUE 或PRIMARY KEY 約束(它保證了語(yǔ)句只存取單行)的話,Oracle經(jīng)常實(shí)現(xiàn)唯一性掃描。此查找方法效率很高。
索引范圍查找 (index range scan ):
使用一個(gè)索引存取多行數(shù)據(jù),在唯一索引上使用索引范圍掃描的典型情況下是在謂詞(where限制條件)中使用了范圍操作符(如>、<、<>、>=、<=、between)。
索引全部掃描 (index full scan ):
全索引掃描。對(duì)查詢出的數(shù)據(jù)進(jìn)行排序,而且此時(shí)查詢出的數(shù)據(jù)都必須從索引中可以直接得到。同時(shí)order by排序的數(shù)據(jù)應(yīng)該是按索引的順序來(lái)讀取的。 如:explain plan for select empno,ename from big_emp order by empno,ename。
索引快速掃描 (index fast full scan ):
與index full scan很類似,但是一個(gè)顯著的區(qū)別就是它不對(duì)查詢出的數(shù)據(jù)進(jìn)行排序,即數(shù)據(jù)不是以排序順序被返回 ,在這種存取方法中,可以使用多塊讀功能,也可以使用并行讀入,以便獲得***吞吐量與縮短執(zhí)行時(shí)間,索引快速全局掃描,不帶order by情況下常發(fā)生,如:explain plan for select empno,ename from big_emp。
索引跳躍式查找(index skip scan ):
where條件列是非索引的前導(dǎo)列情況下常發(fā)生。如下:
- create index i_emp on emp(empno, ename);
- select /* + index_ss(emp i_emp) */ job from emp where ename = ' SMITH ' ;
總結(jié):
index full scan(索引全掃描):有排序 ,就是利用到了index的排序功能。原理:通過(guò)root根級(jí)----到中間級(jí)---葉級(jí)。
index fast full scan (索引快速掃描):無(wú)排序, 就可以利用多塊讀取方式,提高查詢速度,因?yàn)閿?shù)據(jù)要求是無(wú)序的。即可以使用多塊查詢,取出的數(shù)據(jù)就是數(shù)據(jù)存放的順序。
當(dāng)進(jìn)行index full scan的時(shí)候oracle定位到索引的root block,然后到branch block(如果有的話),再定位到***個(gè)leaf block, 然后根據(jù)leaf block的雙向鏈表順序讀取。它所讀取的塊都是有順序的,也是經(jīng)過(guò)排序的。
而index fast full scan則不同,它是從段頭開(kāi)始,讀取包含位圖塊,root block,所有的branch block, leaf block,讀取的順序完全有物理存儲(chǔ)位置決定,并采取多塊讀,每次讀取db_file_multiblock_read_count個(gè)。
關(guān)于Oracle 10g查找數(shù)據(jù)的方式就介紹這么多了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】






