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

Oracle 表連接機制深度解析:Sort Merge Join 原理、特性、優化與實戰調優

     編輯:Oracle 教學

Oracle 表連接機制深度解析:Sort Merge Join (SMJ)

一、核心原理

Sort Merge Join (排序合併連接) 適用於**非等值連接** (>, <, >=, <=, !=) 或**已排序資料集**場景:

  1. 驅動表:依謂詞過濾 → 依連接鍵 **排序**
  2. 被驅動表:依謂詞過濾 → 依連接鍵 **排序**
  3. 合併階段**:雙指標掃描兩有序集合,匹配連接條件輸出結果

適用條件:Hash Join 僅支援等值連接 (`=`),非等值連接**只能**用 SMJ 或 Nested Loops。若連接鍵**已有索引/預排序**,SMJ 效能優於 NL。

二、關鍵特性

三、實測驗證 (t3 1,000 行 / t4 10,000 行)

1. 等值連接 + 無過濾 → SMJ (非最優,Hash Join 更好)

SELECT /*+ LEADING(t3) USE_MERGE(t4) */ * FROM t3, t4 WHERE t3.id = t4.t3_id;
-- Plan: MERGE JOIN → SORT JOIN (t3) → SORT JOIN (t4)
-- Buffers: 119

2. 驅動表互換 (t4 驅動 t3) → 成本幾乎相同

SELECT /*+ LEADING(t4) USE_MERGE(t3) */ * FROM t3, t4 WHERE t3.id = t4.t3_id;
-- Buffers: 119 (驅動表選擇影響極小)

3. 加入謂詞過濾 (t3.n=1100, t4.n=10034) → 全表掃描依然

SELECT /*+ LEADING(t3) USE_MERGE(t4) */ * FROM t3, t4
WHERE t3.id = t4.t3_id AND t3.n = 1100 AND t4.n = 10034;
-- Buffers: 119 (無索引,全掃描後排序)

4. 建立索引 (t4.n, t3.n) → 索引範圍掃描大幅降低 Buffers

CREATE INDEX t4_n ON t4(n);
-- Buffers: 18 (INDEX RANGE SCAN + TABLE ACCESS BY INDEX ROWID)

CREATE INDEX t3_n ON t3(n);
-- Buffers: 6 (雙索引範圍掃描)

四、執行計劃關鍵指標解讀

特性說明
驅動表訪問次數**最多一次**;若獨立謂詞不成立,可完全跳過驅動表
被驅動表訪問次數**最多一次**;若驅動表無資料,被驅動表不訪問
驅動表選擇影響**對成本影響較小** (雙方都需全掃描+排序)
支援連接條件>, <, >=, <= **支援**;LIKE, !=, <> **不支援**
排序場所PGA (工作區) → 空間不足則寫入 Temp 表空間 (磁盤)

五、SMJ 優化三板斧

  1. 建立連接鍵/謂詞欄位索引**:避免全表掃描 + 大量排序,轉為 Index Range Scan → 減少排序輸入行數。
  2. 擴大 PGA (PGA_AGGREGATE_TARGET / MEMORY_TARGET)**:確保排序在記憶體完成,**Used-Mem 後括號為 0**。
  3. 精簡 SELECT 列表**:排序行寬越窄,記憶體佔用越少,磁盤排序概率越低。

六、調優決策樹


						
						
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
欄位含義關注點
OMem預估記憶體排序所需 (Bytes)是否超過 PGA_AGGREGATE_TARGET
1Mem單次磁盤排序預估記憶體 (Bytes)越小越好
Used-Mem實際使用記憶體 (括號內為磁盤排序次數)Used-Mem (0) = 純記憶體排序**;>0 發生磁盤 I/O