表連線方法

psufnxk2000發表於2011-06-24
表連線方法:
1、巢狀迴圈連線(nested loops join)
2、排序合併連線(sort merge join)
3.叢集連線(cluster join)
4.笛卡爾連線(cartesian join)
5.雜湊連線(hash join)
6.索引連線(index join)
1:巢狀迴圈連線。
  假設有人給您一個電話號碼簿,並需查詢其中20個人的號碼,要求你寫下每個人的名字以及他們各自的電話號碼,你可能會從前往後查閱姓名列表,在電話簿中查詢每個人的姓名。這個任務相對簡單,是因為電話簿是按姓名的字母排序的。但是,當你正在查詢剩餘的姓名和號碼時,其他人就可以撥打你已經寫下來的姓名和號碼,這種情況就稱為巢狀迴圈連線。
 在巢狀迴圈連線中,oracle從第一個行源中讀取第一行,然後和第二個行源中的資料進行對比。所有匹配的記錄放在結果集中,然後oracle將讀取第一個行源中的下一行。按這種方式直到每一個資料來源中的所有行都 經過處理。第一個行的源通常稱為外部表,或者驅動表,相應 的第二個行源稱為內部表,使用黃磊迴圈連線是一種從連線結果中提取第一批記錄的最快速的方法。
2.排序合併連線
假設兩個銷售人員參加了一個會議,每個人都蒐集了100張潛在客戶的名片,他們每個人現在都有一堆沒有排序的名片,並且都想檢查一下兩堆名片中有多少重複的名片。銷售人員按字母排序整理了名片堆,然後兩個人輪流依次報名片。由於兩堆名片都已經序,將很容易找到兩堆名片中重複的名片。這個例子解釋了排序合併連線。
在排序合併連線中,oracle分別將第一個源表、第二個源表按他們各自要連線的列排序,然後將兩個已經排序的源表合併。如果找到匹配的資料,就放在結果集中。
在缺乏資料的選擇性或者可用的時,或者兩個源表都過於龐大時,排序合併連線將比巢狀迴圈連線更加高效。但是排序全並連線 只能用於造價連線 where d.deptno=e.deptno 而不是where d.deptno>=e.deptno。排序合併連線需要臨時的記憶體塊,以用於排序,這將導致 在臨時表空間佔用更多的記憶體和磁碟i/o。
3.叢集連線
叢集連線實際上是巢狀迴圈連線的一種特例。如果所連線的兩張行源表實際 上是叢集中的表,並且連線是兩張行源表的叢集鍵間的造價連線,那麼在oracle中就能使用叢集連線。這種情況下,oracle從第一張行源表中讀取第一行,並在第二張行源表中使用cluser索引查詢所有匹配的項。叢集索引效率極高,因為兩個參加 連線的行源表實際上處於同一個物理資料塊上。然而叢集連線有它自己的限制,你不可能進行沒有叢集的叢集連線。所以叢集連線實際上很少使用。
4.雜湊連線
當記憶體能夠提供足夠的空間時,雜湊連線 是oracle優化器通常的選擇。在雜湊連線中,oracle訪問一張表(通常是連線結果中較小的表),並在記憶體中建立 一張基於連線鍵的雜湊表。然後它掃描連線中其他的表(通常是較大的表),並根據雜湊表檢測 是否有匹配的記錄。只有引數 pga_aggregate_target設定了足夠大的值的時候,oracle才會有效地使用雜湊連線。如果設定了sga_target,則必須pga_aggregate_target,因為sag_target不包含pga。雜湊連線與巢狀迴圈連線有點類似,因為其中巢狀迴圈 oracle先建立 一張雜湊表以籃球操作進行,然後迴圈訪問雜湊表。當使用ordered提示時,from 子句中的第一張表將用於建立 雜湊表。
5.索引連線
在oracle 8i之前,必須訪問 表,直到索引包含了所有需要的資訊.從oracle 8i起,如果一組已存在的索引包含了查詢所需要的所有資訊,那麼優化器將在索引中有選擇地生成一組雜湊 表。可通過範圍掃描或者快速全域性掃描訪問到每一個索引,而讚揚 佑種掃描方法取決於where子句中的可用條件。在一張表有大量的列,而你只想訪問 有限的列時,這種方法非常有效。where子句中約束條件越多,執行速度在越快。因為優化器在評估執行查詢的優化路徑時,將把約束條件作為選 項看待。
必須 在合適的列上建 立索引,這樣可以確保優化器將索引連線作為可選項之一。這個任務通常牽涉到在沒有索引,或者 以前沒有建立 聯合索引的列上增加 索引。相對於快速全域性掃描,索引的優勢在於:快速全域性掃描只有一個單一索引滿足整個查詢。索引連線可以 有多個索引滿足整個查詢。

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

相關文章