ORACLE表與表聯接的幾種方式
三大表與表聯接方式
1.NESTED LOOPS 巢狀迴圈
2.HASH JOIN 雜湊聯接
3.SORT MERGE 排序合併聯接
1.NESTED LOOPS 巢狀迴圈
巢狀迴圈的本質是將外部資料集連線到內部資料集,對於外部資料集中與單表謂詞匹配的每一行,資料庫將檢索內部資料集中滿足連線謂詞的所有行。
工作原理:
a.優化器確定驅動行源並將其指定為外部迴圈。
b.優化器將另一行源指定為內部迴圈。
c.從外部行源獲取一行
d.探查內部行源以查詢與謂詞條件匹配的行
e.重複前面的步驟,直到通過獲取請求獲得所有行
巢狀迴圈優先使用場景:
a.查詢結果集偏小。
b.資料庫以優化器模式設定為聯接大型資料集FIRST_ROWS
c.內部迴圈有有效訪問方式(例如存在高效索引)
HINT :
/*+ ORDERED USE_NL(d) */ ----d 為內部迴圈表-被驅動表
2.HASH JOIN 雜湊聯接
優化器使用兩個資料集中的較小者在記憶體中的連線鍵上構建雜湊表,並使用確定性雜湊函式指定雜湊表中儲存每一行的位置。然後,資料庫掃描更大的資料集,探測雜湊表以查詢滿足聯接條件的行。
工作原理:
-
資料庫對較小的資料集執行完整掃描,然後在PGA和磁碟上構建一個雜湊桶陣列。
當PGA雜湊區域填滿時,資料庫將在雜湊表中找到最大的分割槽,並將其寫入磁碟上的臨時空間。
-
資料庫在讀取其他資料集時會經過第一遍。
對於每一行,資料庫執行以下操作:
-
將相同的雜湊函式應用於一個或多個聯接列,以計算相關雜湊桶的數量。
-
探測雜湊表,以確定儲存桶中的行中是否存在行。
如果雜湊值指向記憶體中的一行,則資料庫將完成連線並返回該行。但是,如果該值指向磁碟上的雜湊分割槽,則資料庫使用與原始資料集相同的分割槽方案將該行儲存在臨時表空間中。
-
-
資料庫逐個讀取每個磁碟上的臨時分割槽
-
資料庫將每個分割槽行連線到相應的磁碟臨時分割槽中的行.
雜湊聯接優先使用場景:
a.聯接相對大量的資料(或必須連線很大比例的小表)且聯接為等聯接。
HINT :USE_HASH
3.SORT MERGE 排序合併聯接
排序合併聯接是巢狀迴圈聯接的一種變體。
如果聯接中的兩個資料集尚未排序,則資料庫將它們排序。這些是SORT JOIN
操作。對於第一個資料集中的每一行,資料庫都會根據匹配的行來探測第二個資料集,並將它們連線起來,並將其起始位置基於上一次迭代中進行的匹配。這就是MERGE JOIN
操作。
工作原理:
與巢狀迴圈聯接中一樣,排序合併聯接讀取兩個資料集,但在尚未對它們進行排序時對其進行排序。
對於第一個資料集中的每一行,資料庫在第二個資料集中找到起始行,然後讀取第二個資料集,直到找到不匹配的行。
通常情況下,只有在以下情況發生時,才會使用排序合併連線:
1)RBO模式
2)不等值連線(>,<,>=,<=)
3)雜湊連線被禁用時(_HASH_JOIN_ENABLED=false)
4)資料來源已排序
HINT:
USE_MERGE