Oracle 執行計劃 訪問路徑

j04212發表於2014-02-13


--訪問路徑

1、全表掃描 FTS(Full Table Scan)
如果要讀取表的大部分行或著表很小時,全表掃描是有利的;如果只需要讀取表的小部分行,則更適於索引掃描。


2、索引掃描(Index Scan)

索引掃描是用列資料的索引來快速查詢於某些列值相匹配的行。索引的葉塊包含資料的 ROWID。一旦確定了 ROWID,即可進行 ROWID 掃描。


3、索引範圍掃描(Index Range Scan)

如果需要返回一個資料範圍,並且存在列索引,可以使用一個更加有效的方法來利用索引訪問資料。在查詢中使用 between 、order by、大於、小於、小於等於、大於等於操作符會喚起索引範圍掃描。


4、ROWID 查詢

ROWID 可以通過給實際的資料檔案、物件、塊和塊中的行做標記來唯一識別各行,以此查詢一行資料。如果 ROWID 是事先已知的,則 ROWID 查詢是訪問一行資料的最快方法。但通常 ROWID 都是事先未知的。


5、索引挑掃(Index Skip Scan)

在 Oracle 9i以前的版本中,where 子句必須在複合索引中有主列才能使用。索引跳掃意味著不必有某個複合索引的全部主列就可以使用該索引。


6、快速全索引掃描(Fast Full Index Scan)

如果索引包含有需要返回的所有資料,那麼就根本不需要訪問表中的資料塊。快速索引掃描只讀取索引塊,而不訪問表中的資料。因此僅當 select 和 where 子句中只有索引列的時候,這種訪問資料的速度才是可能的。


7、索引合併(Index Join)

索引合併並不是表合併,而是將多個索引合併到一起,並以類似於快速全索引掃描的方式使用。在查詢中只能使用索引中的哪些列,否則就需要訪問表。


--合併
當多個表參與查詢時候,就需要將這些表以某種方式合併到一起。在from子句中出現多個表就說明需要合併。將多個表合併到一起有四種基本方法:Cartesian 合併、巢狀迴圈合併、排序合併、雜湊合併。合併操作只將兩個表合併到一起。如果from 子句中有第三個表,就將前面兩個表的合併結果與第三個表合併。這個過程會一直持續,知道將所有表都合併到一起,從而形成一個結果集。


1、Cartesian 合併(Cartesian Join)

要建立一個 Cartesian 合併(有時候稱作 Cartesian 乘積),需要將一個表中的每行與另一個表中的每行相匹配。這需要對兩個表都進行 FTS。許多時候都不需要 Cartesian 合併,可以通過在 where 子句中加入合併條件來插入 Carsian 合併。優化器偶爾會選擇對兩個非常小的表執行 Cartesian 合併,然後消除不參與合併的行。


2、巢狀迴圈合併(Nested Loop Join)

巢狀迴圈合併是最早的合併方法之一。這種合併方法首先要從參與合併的表中選出一個作為驅動表(或外部表),參與合併的另一個表則為內部表。要讀取外部表的每一行,對外部表的每一行,都要在內部表中進行搜尋,看是否可以匹配。對外部表是用FTS 進行訪問的;對內部表則可用其他任何訪問方法。當外部表較小並且內部表可以快速搜尋以進行匹配(理想的是通過索引)時,應優先選用巢狀迴圈合併。


3、排序歸併合併(Sort Merge Joins)

排序歸併合併首先將兩個表排序。排序後,將結果歸併在一起以查詢匹配的資料行。典型情況下,雜湊合併與巢狀迴圈合併優於排序歸併合併。但是,如果資料已經排好序或者需要 non-equi-join 時,排序歸併合併就較好。


4、雜湊合併(Hash Join)

為了進行雜湊合併,需要對兩個表中較小的表執行雜湊函式。該雜湊函式建立一個表,該表中的資料可以很快查詢到;隨後對兩表中較大的表執行相同的雜湊函式,如果第二個表中有一行與第一個表中的一行相匹配,那麼就能很快查詢到這行資料。當有足夠的記憶體來存放整個小表時,雜湊合併效果最好。要能進行雜湊合併,首先必須進行 equi-join (查詢兩表中對等的記錄)。


5、外部合併(Outer Join)

在前面的合併方法中,只有當在另外一個表中存在匹配時,才會在結果集中包含表中的行;反之亦然。在外部合併中,即使在另外一個表中沒有匹配,表中所有的資料行都要參與合併。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27633655/viewspace-1080694/,如需轉載,請註明出處,否則將追究法律責任。

相關文章