oracle join 嵌套,誰能真正理解hash join/nested loop/merge join
關于這三種JOIN的理解。Nested loop join,Hash join,Sort merge join
Nested loop join:
步驟:確定一個驅動表(outer table),另一個表為inner table,驅動表中的每一行與inner表中的相應記錄JOIN。類似一個嵌套的循環。適用于驅動表的記錄集比較小(<10000)而且inner表需要有有效的訪問方法(Index)。需要注意的是:JOIN的順序很重要,驅動表的記錄集一定要小,返回結果集的響應時間是最快的。
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
步驟:將兩個表中較小的一個在內存中構造一個HASH表(對JOIN KEY),掃描另一個表,同樣對JOIN KEY進行HASH后探測是否可以JOIN。適用于記錄集比較大的情況。需要注意的是:如果HASH表太大,無法一次構造在內存中,則分成若干個partition,寫入磁盤的temporary segment,則會多一個寫的代價,會降低效率。
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
步驟:將兩個表排序,然后將兩個表合并。通常情況下,只有在以下情況發生時,才會使用此種JOIN方式:
1.RBO模式
2.不等價關聯(>,=,<=,
3.HASH_JOIN_ENABLED=false
4.數據源已排序
cost = (outer access cost * # of hash partitions) + inner access cost
總結
以上是生活随笔為你收集整理的oracle join 嵌套,誰能真正理解hash join/nested loop/merge join的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB代写要求应该怎么写,matl
- 下一篇: php底层实现也是c语言,深入php内核