簡介 Oracle中的三種Join方法

2021-04-28 22:06:03 字數 2394 閱讀 2876

基本概念

nestedloop join:

outertable中的每一行與inner table中的相應記錄join,類似乙個巢狀的迴圈。

sort merge join:

將兩個表排序,然後再進行join。

hash join:

將兩個表中較小的乙個在記憶體中構造乙個hash 表(對joinkey),掃瞄另乙個表,同樣對join key進行hash後探測是否可以join,找出與之匹配的行。

一張小表被hash在記憶體中。因為資料量小,所以這張小表的大多數資料已經駐入在記憶體中,剩下的少量資料被放置在臨時表空間中;

每讀取大表的一條記錄,就和小表中記憶體中的資料進行比較,如果符合,則立即輸出資料(也就是說沒有讀取臨時表空間中的小表的資料)。而如果大表的資料與小表中臨時表空間的資料相符合,則不直接輸出,而是也被儲存臨時表空間中。

當大表的所有資料都讀取完畢,將臨時表空間中的資料以其輸出。如果小表的資料量足夠小(小於hashareasize),那所有資料就都在記憶體中了,可以避免對臨時表空間的讀寫。

如果是並行環境下,前面中的第2步就變成如下了:每讀取一條大表的記錄,和記憶體中小表的資料比較,如果符合先做join,而不直接輸出,直到整張大表資料讀取完畢。如果記憶體足夠,join好的資料就儲存在記憶體中。否則,就儲存在臨時表空間中。

適用範圍

nestedloopjoin:

適用於outer table(有的地方叫master table)的記錄集比較少(<10000)而且inner table(有的地方叫detail table)索引選擇性較好的情況下(inner table要有index)。

inner table被outer table驅動,outer table返回的每一行都要在inner table中檢索到與之匹配的行。當然也可以用ordered 提示來改變cbo預設的驅動表,使用use_nl(table_name1 table_name2)可是強制cbo 執行巢狀迴圈連線。

cost = outeraccesscost + (inner access cost * outercardinality)

sort merge join:

用在資料沒有索引但是已經排序的情況下。

通常情況下hash join的效果都比sort merge join要好,然而如果行源已經被排過序,在執行排序合併連線時不需要再排序了,這時sort merge join的效能會優於hash join。可以使用use_merge(table_name1 table_name2)來強制使用sort merge join。

cost = (outeraccesscost * # of hash partitions) + inner access cost

hash join:

適用於兩個表的資料量差別很大。但需要注意的是:如果hash錶太大,無法一次構造在記憶體中,則分成若干個partition,寫入磁碟的temporarysegment,則會多乙個i/o的代價,會降低效率,此時需要有較大的temporary segment從而盡量提高i/o的效能。

可以用use_hash(table_name1 table_name2)提示來強制使用雜湊連線。如果使用雜湊連hash_area_size 初始化引數必須足夠的大,如果是9i,oracle建議使用sql工作區自動管理,設定workarea_size_policy 為auto,然後調整pga_aggregate_target 即可。

也可以使用hash_join_enabled=false(預設為true)強制不使用hash join。

cost = (outer access cost * # of hash partitions) + inner access cost

效率比較

hash join的主要資源消耗在於cpu(在記憶體中建立臨時的hash表,並進行hash計算),而merge join的資源消耗主要在於磁碟i/o(掃瞄表或索引)。在並行系統中,hash join對cpu的消耗更加明顯。所以在cpu緊張時,最好限制使用hash join。

在絕大多數情況下,hash join效率比其他join方式效率更高:

在sort-merge join(smj),兩張表的資料都需要先做排序,然後做merge。因此效率相對最差;

nested-loop join(nl)效率比smj更高。特別是當驅動表的資料量很大(集的勢高)時。這樣可以並行掃瞄內錶。

hash join效率最高,因為只要對兩張表掃瞄一次。

三種交換技術的簡介

1 電路交換技術 網路交換技術共經歷了四個發展階段,電路交換技術 報文交換技術 分組交換技術和atm技術。公眾 網 pstn網 和移動網 包括gsm網和cdma網 採用的都是電路交換技術,它的基本特點是採用面向連線的方式,在雙方進行通訊之前,需要為通訊雙方分配一條具有固定頻寬的通訊電路,通訊雙方在通...

三種交換技術的簡介

1 電路交換技術 網路交換技術共經歷了四個發展階段,電路交換技術 報文交換技術 分組交換技術和atm技術。公眾 網 pstn網 和移動網 包括gsm網和cdma網 採用的都是電路交換技術,它的基本特點是採用面向連線的方式,在雙方進行通訊之前,需要為通訊雙方分配一條具有固定頻寬的通訊電路,通訊雙方在通...

三種交換技術的簡介

1 電路交換技術 網路交換技術共經歷了四個發展階段,電路交換技術 報文交換技術 分組交換技術和atm技術。公眾 網 pstn網 和移動網 包括gsm網和cdma網 採用的都是電路交換技術,它的基本特點是採用面向連線的方式,在雙方進行通訊之前,需要為通訊雙方分配一條具有固定頻寬的通訊電路,通訊雙方在通...