關(guān)于三種JOIN的理解
2024-07-21 02:33:17
供稿:網(wǎng)友
Nested loop join:
步驟:確定一個(gè)驅(qū)動(dòng)表(outer table),另一個(gè)表為inner table,驅(qū)動(dòng)表中的每一行與inner表中的相應(yīng)記錄JOIN。類似一個(gè)嵌套的循環(huán)。適用于驅(qū)動(dòng)表的記錄集比較小(<10000)而且inner表需要有有效的訪問(wèn)方法(Index)。 需要注重的是:JOIN的順序很重要,驅(qū)動(dòng)表的記錄集一定要小,返回結(jié)果集的響應(yīng)時(shí)間是最快的。
cost = outer access cost + (inner access cost * outer cardinality)
2 NESTED LOOPS 3 141 7 (15)
3 TABLE ACCESS FULL EMPLOYEES 3 60 4 (25)
4 TABLE ACCESS BY INDEX ROWID JOBS 19 513 2 (50)
5 INDEX UNIQUE SCAN JOB_ID_PK 1
EMPLOYEES為outer table, JOBS為inner table.
Hash join
步驟:將兩個(gè)表中較小的一個(gè)在內(nèi)存中構(gòu)造一個(gè)HASH表(對(duì)JOIN KEY),掃描另一個(gè)表,同樣對(duì)JOIN KEY進(jìn)行HASH后探測(cè)是否可以JOIN。適用于記錄集比較大的情況。需要注重的是:假如HASH表太大,無(wú)法一次構(gòu)造在內(nèi)存中,則分成若干個(gè)partition,寫(xiě)入磁盤(pán)的temporary segment,則會(huì)多一個(gè)寫(xiě)的代價(jià),會(huì)降低效率。
cost = (outer access cost * # of hash partitions) + inner access cost
--------------------------------------------------------------------------
Id Operation Name Rows Bytes Cost (%CPU)
--------------------------------------------------------------------------
0 SELECT STATEMENT 665 13300 8 (25)
1 HASH JOIN 665 13300 8 (25)
2 TABLE ACCESS FULL ORDERS 105 840 4 (25)
3 TABLE ACCESS FULL ORDER_ITEMS 665 7980 4 (25)
--------------------------------------------------------------------------
ORDERS為HASH TABLE,ORDER_ITEMS掃描
Sort merge join
步驟:將兩個(gè)表排序,然后將兩個(gè)表合并。通常情況下,只有在以下情況發(fā)生時(shí),才會(huì)使用此種JOIN方式:
1.RBO模式
2.不等價(jià)關(guān)聯(lián)(>,<,>=,<=,<>)
3.HASH_JOIN_ENABLED=false
4.數(shù)據(jù)源已排序
cost = (outer access cost * # of hash partitions) + inner access cost