在 Oracle 資料庫效能調校的領域中,理解執行計劃如何連接表格是核心技能之一。當查詢涉及多張表時,Oracle 優化器必須決定採用哪種連接演算法、以何種順序存取表格,這些決策直接決定了查詢的回應時間與資源消耗。本文將系統性剖析三大經典連接類型——排序合併連接、巢狀迴圈連接、雜湊連接的內部運作原理、適用場景與效能考量。
在連接操作中,Oracle 以「Row Source」(列來源)來代表參與連接的資料集,而非單純的「表」。一個 Row Source 可以是實體表、視圖、子查詢結果,甚至是另一個連接操作的輸出。連接順序對效能影響極大:優化器會嘗試先套用限制條件(WHERE 子句)產生較小的 Row Source 作為「驅動表」(外部表),以減少後續連接的資料量。這就是為何「先過濾、後連接」是 SQL 撰寫的黃金法則。
依連接條件中的運算子,可分為:
WHERE A.COL3 = B.COL4,最常見且最易優化。WHERE A.COL3 > B.COL4,無法使用雜湊連接,通常退回巢狀迴圈或排序合併。WHERE A.COL3 = B.COL4(+),保留單邊所有資料,優化器處理較複雜。本文以等值連接為例,闡述三大核心演算法。
A.COL3、B.COL4)獨立排序。>、<、>=、<=)的唯一選擇。NL Join 如同雙層迴圈:
FOR each row IN Outer_Row_Source (驅動表) LOOP
FOR each matching row IN Inner_Row_Source (被驅動表) LOOP
輸出連接結果
END LOOP;
END LOOP;
HASH_AREA_SIZE 或 PGA_AGGREGATE_TARGET 限制,將分區溢寫至 Temp 表空間,效能驟降。| 維度 | Sort Merge Join | Nested Loops | Hash Join |
|---|---|---|---|
| 連接類型 | 等值 / 非等值 | 等值 | 僅等值 |
| 索引依賴 | 可利用索引免排序 | 內表必須有索引 | 完全不需要索引 |
| 記憶體需求 | 中(排序區) | 低 | 高(雜湊表) |
| 並行能力 | 部分並行 | 難並行 | 完美並行 |
| 典型適用 | 非等值、預排序資料 | 小結果集、OLTP | 大表等值、DW/報表 |
CBO(Cost-Based Optimizer)會根據統計資訊估算各連接方式的 Cost:
最佳實務:定期收集統計資訊(DBMS_STATS)、關鍵欄位建立直方圖、必要時使用 Hint(USE_NL、USE_HASH、USE_MERGE)強制指定,但以修正統計資訊為根本。
掌握三大連接演算法的內核機制,能讓你從執行計劃一眼看穿效能瓶頸:
MERGE JOIN + SORT JOIN → 檢查是否可加索引免排序、或改 Hash Join。NESTED LOOPS 且內表 FULL TABLE SCAN → 必須加索引或改寫 SQL。HASH JOIN 溢寫 Temp → 增加 PGA、或調整 HASH_AREA_SIZE。記住:沒有最好的連接方式,只有最適合當前資料分布與硬體資源的選擇。持續監控、分析執行計劃、維護精準統計資訊,才是穩定效能的不二法門。