Nested loop join:
步驟:確定一個(gè)驅(qū)動(dòng)表(outer table),另一個(gè)表為inner table,驅(qū)動(dòng)表中的每一行與inner表中的相應(yīng)記錄JOIN。類(lèi)似一個(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
步驟:確定一個(gè)驅(qū)動(dòng)表(outer table),另一個(gè)表為inner table,驅(qū)動(dòng)表中的每一行與inner表中的相應(yīng)記錄JOIN。類(lèi)似一個(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