四表 Hash Join:A(1K) → B(1M) → C(8M) → D(1M)。關聯鏈:A-B、B-C、C-D。預設 ORDERED 會依 FROM 子句順序以 A 為 Build,依序 Probe B、C、D。但 D 較小,期望 D 為最終 Build,前三表結果為 Probe。
Oracle 10g+ 支援在 Hash Join 層級控制 Build/Probe 角色:
NO_SWAP_JOIN_INPUTS(t):t 為 Build 端(輸入不交換)。SWAP_JOIN_INPUTS(t):t 為 Probe 端(輸入交換)。SELECT /*+
LEADING(t1 t2 t3 t4)
USE_HASH(t2)
USE_HASH(t3)
SWAP_JOIN_INPUTS(t3) -- t3 為 Probe,前兩表結果為 Build
USE_HASH(t4)
NO_SWAP_JOIN_INPUTS(t4) -- t4 為 Build,前三表結果為 Probe
*/
*
FROM t1, t2, t3, t4
WHERE t1.object_id = t2.object_id
AND t2.object_name = t3.object_name
AND t3.owner = t4.owner
AND t4.owner = 'MYDB';
HASH JOIN
HASH JOIN
HASH JOIN
TABLE ACCESS FULL T1 -- Build
TABLE ACCESS FULL T2 -- Probe
TABLE ACCESS FULL T3 -- Probe (SWAP_JOIN_INPUTS)
TABLE ACCESS FULL T4 -- Build (NO_SWAP_JOIN_INPUTS)
| Hint | 功能 | 適用場景 |
|---|---|---|
| ORDERED | 依 FROM 子句順序固定 Join 順序 | 簡單線性聯結 |
| LEADING(t1 t2 t3 t4) | 明確指定 Join 順序(不受 FROM 順序限制) | 複雜聯結、需精確控制 |
| SWAP/NO_SWAP_JOIN_INPUTS | 控制 Hash Join 的 Build/Probe 角色 | 大小表搭配、記憶體優化 |