一、 嵌套迴圈串連(Nested Loop)
其主要是選擇出一張表作為外表,然後迴圈外表,並且每一個外表中的記錄又在內表中作迴圈。
嵌套迴圈串連的工作方式是這樣的:
1、 Oracle首先選擇一張表作為串連的驅動表,這張表也稱為外部表格(Outer Table)。由驅動表進行驅動串連的表或資料來源稱為內部表(Inner Table)。
2、 提取驅動表中合格記錄,與被驅動表的串連列進行關聯查詢合格記錄。在這個過程中,Oracle首先提取驅動表中合格第一條記錄,再與內部表的串連列進行關聯查詢相應的記錄行。在關聯查詢的過程中,Oracle會持續提取驅動表中其他合格記錄與內部表關聯查詢。這兩個過程是並行進行的,因此嵌套迴圈串連返回前幾條記錄的速度是非常快的。在這裡需要說明的是,由於Oracle最小的IO單位為單個資料區塊,因此在這個過程中Oracle會首先提取驅動表中合格單個資料區塊中的所有行,再與內部表進行關聯串連查詢的,然後提取下一個資料區塊中的記錄持續地迴圈串連下去。當然,如果單行記錄跨越多個資料區塊的話,就是一次單條記錄進行關聯查詢的。
二、 排序合并串連(Sort Merge)
其主要是串連的表排序,然後根據排序結果進行串連。
排序合并串連的方法非常簡單。在排序合并串連中是沒有驅動表的概念的,兩個互相串連的表按串連列的值先排序,排序完後形成的結果集再互相進行合并串連提取合格記錄。相比嵌套迴圈串連,排序合并串連比較適用於返回大資料量的結果。
三、 雜湊串連(Hash join)
其主要是兩張表都先根據條件進行選擇,然後,選擇出一張表作為外表,然後再另一張表已經查詢結束的結果集中進行檢索。
雜湊串連分為兩個階段,如下。
1、 構建階段:最佳化器首先選擇一張小表做為驅動表,運用雜湊函數對串連列進行計算產生一張雜湊表。通常這個步驟是在記憶體(hash_area_size)裡面進行的,因此運算很快。
2、 探測階段:最佳化器對被驅動表的串連列運用同樣的雜湊Function Compute得到的結果與前面形成的雜湊表進行探測返回合格記錄。這個階段中如果被驅動表的串連列的值沒有與驅動表串連列的值相等的話,那麼這些記錄將會被丟棄而不進行探測。
四、 Filter
Filter 的工作方式是,先全表掃描兩張表,然後做笛卡爾積,之後再進行查詢。