Oracle-錶鏈接類型和錶鏈接方式

錶鏈接類型:

Oracle - 錶鏈接的幾種類型:html

  • 內鏈接(天然鏈接)
  • 外鏈接 web

    • 左外鏈接 (左邊的表不加限制)
    • 右外鏈接(右邊的表不加限制)
    • 全外鏈接(左右兩表都不加限制)
  • 自鏈接(同一張表內的鏈接)

SQL的標準語法:sql

select table1.column,table2.column
from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2;

inner join 表示內鏈接;
left join表示左外鏈接;
right join表示右外鏈接;
full join表示徹底外鏈接;
on子句 用於指定鏈接條件。

注意:
1.若是使用from子句指定內、外鏈接,則必需要使用on子句指定鏈接條件;
2.若是使用(+)操做符指定外鏈接,則必須使用where子句指定鏈接條件。

示意圖以下:svg

鏈接類型示意圖


錶鏈接方式:指執行計劃裏面的錶鏈接方式

Oracle - 錶鏈接的幾種方式:函數

  • SORT MERGE JOIN(排序-合併鏈接)
  • NESTED LOOPS(嵌套循環)
  • HASH JOIN(哈希鏈接)
  • CARTESIAN PRODUCT(笛卡爾積)

鏈接說明:學習

  1. Oracle一次只能鏈接兩個表。無論查詢中有多少個表,Oracle 在鏈接中一次僅能操做兩張表。
  2. 當執行多個表的鏈接時,優化器從一個表開始,將它與另外一個錶鏈接;而後將中間結果與下一個錶鏈接,以此類推,直處處理完全部表爲止。

舉例:優化

注:這裏將首先存取的表稱做 row source 1,將以後參與鏈接的表稱做 row source 2;ui

(1) SORT MERGE JOIN(排序-合併鏈接):spa

假設有查詢:select a.name, b.name from table_A a join table_B b on (a.id = b.id)code

內部鏈接過程:

a) 生成 row source 1 須要的數據,按照鏈接操做關聯列(如示例中的a.id)對這些數據進行排序

b) 生成 row source 2 須要的數據,按照與 a) 中對應的鏈接操做關聯列(b.id)對數據進行排序

c) 兩邊已排序的行放在一塊兒執行合併操做(對兩邊的數據集進行掃描並判斷是否鏈接)

延伸:

若是示例中的鏈接操做關聯列 a.id,b.id 以前就已經被排過序了的話,鏈接速度即可大大提升,由於排序是很費時間和資源的操做,尤爲對於有大量數據的表。

故能夠考慮在 a.id,b.id 上創建索引讓其能預先排好序。不過遺憾的是,因爲返回的結果集中包括全部字段,因此一般的執行計劃中,即便鏈接列存在索引,也不會進入到執行計劃中,除非進行一些特定列處理(如僅僅只查詢有索引的列等)。

排序-合併鏈接的表無驅動順序,誰在前面均可以;

排序-合併鏈接適用的鏈接條件有: < <= = > >= ,不適用的鏈接條件有: <> like

(2) NESTED LOOPS(嵌套循環):

內部鏈接過程:

a) 取出 row source 1 的 row 1(第一行數據),遍歷 row source 2 的全部行並檢查是否有匹配的,取出匹配的行放入結果集中

b) 取出 row source 1 的 row 2(第二行數據),遍歷 row source 2 的全部行並檢查是否有匹配的,取出匹配的行放入結果集中

c) ……

若 row source 1 (即驅動表)中返回了 N 行數據,則 row source 2 也相應的會被全表遍歷 N 次。

由於 row source 1 的每一行都會去匹配 row source 2 的全部行,因此當 row source 1 返回的行數儘量少而且能高效訪問 row source 2(如創建適當的索引)時,效率較高。

延伸:

嵌套循環的表有驅動順序,注意選擇合適的驅動表。

嵌套循環鏈接有一個其餘鏈接方式沒有的好處是:能夠先返回已經鏈接的行,而沒必要等全部的鏈接操做處理完才返回數據,這樣能夠實現快速響應。

應儘量使用限制條件(Where過濾條件)使驅動表(row source 1)返回的行數儘量少,同時在匹配表(row source 2)的鏈接操做關聯列上創建惟一索引(UNIQUE INDEX)或是選擇性較好的非惟一索引,此時嵌套循環鏈接的執行效率會變得很高。若驅動表返回的行數較多,即便匹配錶鏈接操做關聯列上存在索引,鏈接效率也不會很高。

(3)HASH JOIN(哈希鏈接) :

哈希鏈接只適用於等值鏈接(即鏈接條件爲 = )

HASH JOIN對兩個表作鏈接時並不必定是都進行全表掃描,其並不限制表訪問方式;

內部鏈接過程簡述:

a) 取出 row source 1(驅動表,在HASH JOIN中又稱爲Build Table) 的數據集,而後將其構建成內存中的一個 Hash Table(Hash函數的Hash KEY就是鏈接操做關聯列),建立Hash位圖(bitmap)。

b) 取出 row source 2(匹配表)的數據集,對其中的每一條數據的鏈接操做關聯列使用相同的Hash函數並找到對應的 a) 裏的數據在 Hash Table 中的位置,在該位置上檢查可否找到匹配的數據。


補充:

還想進一步加深學習的同窗能夠點擊下列連接,寫的算比較詳細的了。

  1. Oracle表三種鏈接方式(sql優化)

  2. 看懂Oracle執行計劃