連接是 SQL 執行計劃核心操作。優化器根據表大小、索引、內存、並行度在三種連接算子中選擇。理解其原理、適用場景、調優參數對 SQL 性能調優至關重要。
for each row in outer_table:
for each row in inner_table:
if join_condition:
output row
USE_NL(t1 t2) 強制 NLJORDERED 指定連接順序驅動表大、無索引、或全表掃描 Inner 表時性能劇烈下降,優化器會轉向 Hash Join。
HASH_AREA_SIZE (手動) / PGA_AGGREGATE_TARGET + WORKAREA_SIZE_POLICY=AUTO (9i+ 推薦)=),不支持範圍連接分區級並行:Build/Probe 表按相同鍵分區,多進程並行 Join 再合併,需 PARALLEL 屬性或 Hint。
開銷集中在 全表掃描 + 排序。9i 後 Hash Join 普及,SMJ 大幅減少,除非:
>, <, BETWEEN)| 場景 | 推薦算子 | 核心原因 |
|---|---|---|
| 小表驅動大表 + 索引 | NLJ | 索引查找 O(log n) 遠優於 Hash 建表 |
| 大表 Join 大表 (等值) | Hash Join | 線性掃描 + 內存 Hash,避免排序開銷 |
| 已有序輸入 / 需有序輸出 | Sort Merge | 省去排序,歸併 O(n+m) |
| 非等值連接 | Sort Merge / NLJ | Hash Join 僅支持等值 |
| 極小結果集 / 存在過濾條件 | NLJ | 早期過濾減少內層探測 |
舊版 DB2 存在錯誤選擇 SMJ 的 Bug,可通過 DB2_REDUCED_OPTIMIZATION=CAP OFF 修正,並應用最新 Fixpack。
ANALYZE TABLE / DBMS_STATSEXPLAIN PLAN / SET AUTOTRACE掌握三大連接算子特性,結合執行計劃分析,是 SQL 調優從入門到精通的核心技能。