<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > 淺談Oracle中的三種Join方法

淺談Oracle中的三種Join方法

作者: 時(shí)間:2017-06-12 來(lái)源:網(wǎng)絡(luò ) 收藏
基本概念

Nested loop join:

Outer table中的每一行與inner table中的相應記錄join,類(lèi)似一個(gè)嵌套的循環(huán)。

Sort merge join:

將兩個(gè)表排序,然后再進(jìn)行join。

Hash join:

將兩個(gè)表中較小的一個(gè)在內存中構造一個(gè)Hash 表(對Join Key),掃描另一個(gè)表,同樣對Join Key進(jìn)行Hash后探測是否可以join,找出與之匹配的行。

一張小表被hash在內存中。因為數據量小,所以這張小表的大多數數據已經(jīng)駐入在內存中,剩下的少量數據被放置在臨時(shí)表空間中;

每讀取大表的一條記錄,就和小表中內存中的數據進(jìn)行比較,如果符合,則立即輸出數據(也就是說(shuō)沒(méi)有讀取臨時(shí)表空間中的小表的數據)。而如果大表的數據與小表中臨時(shí)表空間的數據相符合,則不直接輸出,而是也被存儲臨時(shí)表空間中。

當大表的所有數據都讀取完畢,將臨時(shí)表空間中的數據以其輸出。如果小表的數據量足夠?。ㄐ∮趆ash area size),那所有數據就都在內存中了,可以避免對臨時(shí)表空間的讀寫(xiě)。

如果是并行環(huán)境下,前面中的第2步就變成如下了:每讀取一條大表的記錄,和內存中小表的數據比較,如果符合先做join,而不直接輸出,直到整張大表數據讀取完畢。如果內存足夠,Join好的數據就保存在內存中。否則,就保存在臨時(shí)表空間中。

適用范圍

Nested loop join:


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

inner table被outer table驅動(dòng),outer table返回的每一行都要在inner table中檢索到與之匹配的行。當然也可以用ORDERED 提示來(lái)改變CBO默認的驅動(dòng)表,使用USE_NL(table_name1 table_name2)可是強制CBO 執行嵌套循環(huán)連接。

cost = outer access cost + (inner access cost * outer cardinality)

Sort merge join:

用在數據沒(méi)有索引但是已經(jīng)排序的情況下。

通常情況下hash join的效果都比Sort merge join要好,然而如果行源已經(jīng)被排過(guò)序,在執行排序合并連接時(shí)不需要再排序了,這時(shí)Sort merge join的性能會(huì )優(yōu)于hash join??梢允褂肬SE_MERGE(table_name1 table_name2)來(lái)強制使用Sort merge join。
cost = (outer access cost * # of hash partitions) + inner access cost

Hash join:

適用于兩個(gè)表的數據量差別很大。但需要注意的是:如果HASH表太大,無(wú)法一次構造在內存中,則分成若干個(gè)partition,寫(xiě)入磁盤(pán)的temporary segment,則會(huì )多一個(gè)I/O的代價(jià),會(huì )降低效率,此時(shí)需要有較大的temporary segment從而盡量提高I/O的性能。

可以用USE_HASH(table_name1 table_name2)提示來(lái)強制使用散列連接。如果使用散列連HASH_AREA_SIZE 初始化參數必須足夠的大,如果是9i,建議使用SQL工作區自動(dòng)管理,設置WORKAREA_SIZE_POLICY 為AUTO,然后調整PGA_AGGREGATE_TARGET 即可。

也可以使用HASH_JOIN_ENABLED=FALSE(默認為T(mén)RUE)強制不使用hash join。

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

效率比較

Hash join的主要資源消耗在于CPU(在內存中創(chuàng )建臨時(shí)的hash表,并進(jìn)行hash計算),而merge join的資源消耗主要在于磁盤(pán)I/O(掃描表或索引)。在并行系統中,hash join對CPU的消耗更加明顯。所以在CPU緊張時(shí),最好限制使用hash join。

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

在Sort-Merge Join(SMJ),兩張表的數據都需要先做排序,然后做merge。因此效率相對最差;

Nested-Loop Join(NL)效率比SMJ更高。特別是當驅動(dòng)表的數據量很大(集的勢高)時(shí)。這樣可以并行掃描內表。

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



關(guān)鍵詞: Oracle Join方法

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>