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

Oracle三大連接演算法深度比較:Nested Loop、Sort Merge、Hash Join

     編輯:Oracle 資料庫基礎

核心機制比較

連接方式核心邏輯資源消耗適用場景
Nested Loop Join外部表每行探測內部表 (如巢狀迴圈)CPU低、I/O看內部表索引外部表小(<10K)、內部表有高選擇性索引
Sort Merge Join雙表各自排序後合併I/O高(排序)、臨時空間大無索引但資料已排序、大表連大表
Hash Join小表建Hash表在記憶體,大表探測CPU高(Hash計算)、記憶體大雙表大小差異大、無索引、記憶體充足

詳細運作原理

Nested Loop Join (NLJ)

  • 驅動表 (Outer) → 探測表 (Inner)
  • Cost = Outer存取成本 + (Inner存取成本 × Outer基數)
  • 強制提示:USE_NL(table1 table2)
  • 可用ORDERED指定驅動順序

Sort Merge Join (SMJ)

  • 兩表皆需排序 (若已有序可省略)
  • Cost = (Outer存取成本 × Hash分區數) + Inner存取成本
  • 強制提示:USE_MERGE(table1 table2)
  • 資料預先有序時優於Hash Join

Hash Join (HJ)

  • 小表在記憶體建Hash表 (Join Key),大表掃描探測
  • 小表超過HASH_AREA_SIZE → 分區寫入臨時表空間,多一次I/O
  • 平行環境:Join結果先存記憶體/臨時表空間,最後一次輸出
  • 強制提示:USE_HASH(table1 table2)
  • 9i+建議:WORKAREA_SIZE_POLICY=AUTO + 調整PGA_AGGREGATE_TARGET
  • 禁用:HASH_JOIN_ENABLED=FALSE

效能比較總結

  1. Hash Join通常最快:僅掃描兩表各一次,CPU換I/O
  2. Nested Loop次之:驅動表小時極快,大表驅動則退化
  3. Sort Merge最慢:雙重排序開銷大,除非資料天然有序

資源權衡決策

  • CPU緊張:限制Hash Join,改用NLJ或SMJ
  • I/O緊張:優先Hash Join (順序讀取)、避免SMJ排序寫入
  • 記憶體不足:Hash Join退化為Grace Hash (多次I/O),考慮NLJ

實務建議:收集完整統計資訊讓CBO自動選擇,僅在計畫明顯錯誤時使用Hint干預。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved