Oracle錶鏈接方法 (上)

Oracle錶鏈接方法

1、 排序合併鏈接:Sort Merge Joinweb

兩張表在作錶鏈接時用排序和合並操做來獲得結果。
假設這兩張表:T1和T2 ,它們進行排序合併鏈接操做的步驟以下:
一、首先用目標SQL中指定的謂詞去訪問表T1,而後對結果按照表T1的鏈接列來排序,排序好的結果集,記爲結果集1。sql

二、再繼續用目標SQL中指定的謂詞去訪問表T2,而後對結果按照表T2的鏈接列進行排序,排序好的結果集,記爲結果集2 。svg

三、接下來進行合併:
遍歷結果集1,取出結果集1中的第一條記錄,而後去結果集2中遍歷,按照條件判斷是否存在這條記錄。而後取結果集1的次日記錄,去結果集2中進行遍歷,直到全部的數據都遍歷完成。可是由於結果1和結果2集都是排序好的結果集,因此並不會每次都對結果集2進行所有遍歷。oop

排序合併鏈接的優缺點及適用場景:優化

1 一般狀況下,排序合併鏈接的效率遠不如哈希鏈接,但前者使用範圍更廣,由於哈希鏈接值適用於等值鏈接。而排序合併鏈接還能英語其餘鏈接條件。
2 嚴格意義上,排序合併鏈接並不存在驅動表的概念。
3 排序合併鏈接不適用與OLTP系統。OLTP系統排序是很是昂貴的操做。code

2、 嵌套循環鏈接: Nested Loops Joinxml

兩張表在作錶鏈接時依靠兩層嵌套循環(分別爲外層循環和內層循環)來獲得鏈接結果集的錶鏈接方法。排序

兩張表T1和T2 在作錶鏈接使用的嵌套循環鏈接時,Oracle執行的步驟以下;
1 首先,優化器會按照必定的規則來決定表T1和T2誰做爲驅動表和被驅動表。驅動表用於外層循環,被驅動表用於內層循環。假設驅動表是T1 被驅動表是T2索引

2 接着用目標SQL中指定的謂詞條件去訪問驅動表T1,訪問驅動表T1後獲得的結果集記爲驅動結果集1。hash

3 而後遍歷驅動結果集1並同時遍歷T2,這個相似於雙層循環的操做,不在贅述。

關於嵌套循環鏈接的優缺點及適用場景,總結以下:

1 若是驅動表所對應的驅動結果集的記錄數比較少,同時在被驅動表的鏈接列上又存在惟一性的索引,那麼此時使用嵌套循環鏈接的執行效率救護很是高。但若是驅動表所對應的驅動結果集的記錄數不少,即使在被驅動表的鏈接列上存在索引,此時使用嵌套循環鏈接的執行效率也不會高。
2
只要驅動結果集的記錄數少,就具有了作嵌套循環鏈接的前提條件,驅動結果集是驅動表應用了目前sql中指定的謂詞後獲得的結果集,所以大表也能夠作驅動表,只要目標sql中指定的謂詞能夠將驅動結果集的數量降下來。
3
嵌套循環鏈接還有一個優勢就是,嵌套循環能夠實現快速響應。 即它能夠在第一時間先返回已經鏈接過且知足鏈接條件的記錄,而沒必要等全部的鏈接操做操做完成以後才返回結果。
雖然排序合併和哈希鏈接也能夠第一時間返回知足鏈接條件的記錄,可是,排序合併鏈接首先要作的是排序操做,也就是返回結果時,必定是在排序操做完成以後。哈希鏈接也要等hashTable創建完成以後,纔會返回結果。

若是Oracle使用的是嵌套循環鏈接,且在被驅動表的鏈接列上存在索引,那麼Oracle在訪問該索引時,一般會使用單塊讀,這意味這嵌套循環鏈接的驅動結果集有多少記錄,Oracle就須要訪問索引多少次,另外若是目標sql中查詢的列並不能所有從被驅動表的相關索引中得到,那麼Oracle在作完嵌套循環鏈接後就還須要對被驅動表進行回表操做,這個回表操做也使用單塊讀,這意味着作完嵌套循環鏈接後的鏈接結果集有多少條記錄,Oracle就須要回表多少次。

對於單塊讀,Oracle須要耗費物理IO去相應的數據文件中獲取。這樣顯然會直接影響單塊讀的執行效率。
爲了提升執行效率Oracle11g 引入了向量IO(Vector I/O) ,在引入向量IO後,Oracle就能夠將原先一批單塊讀所須要耗費的物理IO組合起來,而後用一個向量IO去批量處理他們。
不過這樣,嵌套循環就不能快速相應了,顯然是在全部的鏈接操做執行完成以後,纔會返回結果集。