首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle Hint 深度解析:ORDERED 與 LEADING 控制 Hash Join 順序與 Build/Probe 角色

     編輯:Oracle 資料庫基礎

問題場景

四表 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。

解決方案:LEADING + SWAP_JOIN_INPUTS / NO_SWAP_JOIN_INPUTS

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)

關鍵差異

最佳實務

  1. 優先用 LEADING 替代 ORDERED,語意更清晰。
  2. 配合 USE_HASH 強制 Hash Join 再控制 Build/Probe。
  3. 小表放 Build 端(記憶體放入 Hash Table),大表 Probe 端,減少 I/O。
  4. 驗證方式:EXPLAIN PLAN + DBMS_XPLAN.DISPLAY 觀察 HASH JOIN 縮排結構。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
Hint功能適用場景
ORDERED依 FROM 子句順序固定 Join 順序簡單線性聯結
LEADING(t1 t2 t3 t4)明確指定 Join 順序(不受 FROM 順序限制)複雜聯結、需精確控制
SWAP/NO_SWAP_JOIN_INPUTS控制 Hash Join 的 Build/Probe 角色大小表搭配、記憶體優化