1. 标准哈希连接(HASH JOIN)
- 提示语法:
USE_HASH(table1 table2) - 适用场景:
- 等值连接(Equi-Join):连接条件为
=(如ON t1.id = t2.id) - 大表关联:适用于两张大表或大小表混合的连接,尤其当表无高效索引时
- 返回大量数据:需扫描全表或大部分数据时,效率高于嵌套循环(Nested Loop)
- 等值连接(Equi-Join):连接条件为
- 优化目标:
通过内存哈希表减少磁盘I/O,仅需扫描两表各一次
🔄 2. 反连接(Hash Anti-Join, HASH_AJ)
-
提示语法:
HASH_AJ -
适用场景:
-
NOT EXISTS子查询:如SELECT * FROM t1 WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE t2.id = t1.id) -
NOT IN子查询:需排除子查询结果时(需注意NULL值影响)
-
-
优化原理:
将子查询结果构建为哈希表,主表探测未匹配的记录,避免嵌套循环的低效扫描
🔁 3. 半连接(Hash Semi-Join, HASH_SJ)
- 提示语法:
HASH_SJ - 适用场景:
-
EXISTS子查询:如SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.id = t1.id) -
IN子查询:仅需判断是否存在匹配,无需返回子查询的具体数据
-
- 优化原理:
子查询结果构建哈希表,主表探测到首个匹配即返回,减少不必要的扫描
↔️ 4. 外连接(Hash Outer Join)
- 类型:
- 左外连接(HASH JOIN LEFT):
LEFT OUTER JOIN - 右外连接(HASH JOIN RIGHT):
RIGHT OUTER JOIN - 全外连接(HASH JOIN FULL):
FULL OUTER JOIN
- 左外连接(HASH JOIN LEFT):
- 适用场景:
- 需保留主表所有记录(左/右连接)或两表所有记录(全连接)
- 例如:
SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id
- 优化原理:
以小表为驱动构建哈希表,大表探测匹配,未匹配时补NULL输出
⚙️ 5. 笛卡尔连接(Hash Cartesian Join)
- 提示语法:
USE_HASH+ 无连接条件 - 适用场景:
- 无连接条件的
CROSS JOIN:如SELECT * FROM t1, t2 - 极少使用:通常因SQL错误或特殊需求触发。
- 无连接条件的
- 风险:
结果集可能极大(行数 =t1行数 × t2行数),需谨慎使用
💡 6. 技术扩展:Grace Hash Join 与 Hybrid Hash Join
- 适用场景:
- 超大表连接:当驱动表无法完全放入内存时,自动分阶段处理
- 优化原理:
- Grace Hash Join:将两表按哈希值分区,逐分区在内存中连接
- Hybrid Hash Join:优先处理内存可容纳的分区,减少磁盘I/O
- 触发条件:
驱动表大小 >PGA_AGGREGATE_TARGET或HASH_AREA_SIZE限制
📊 7.Hash Join类型对比与适用场景总结
| 类型 | 提示语法 | 适用场景 | 优化目标 |
|---|---|---|---|
| 标准哈希连接 | USE_HASH |
等值连接、大表关联 | 减少全表扫描,降低I/O |
| 反连接 (HASH_AJ) | HASH_AJ |
NOT EXISTS、NOT IN子查询 |
避免嵌套循环,加速排除逻辑 |
| 半连接 (HASH_SJ) | HASH_SJ |
EXISTS、IN子查询 |
快速匹配存在性,减少冗余扫描 |
| 外连接 | 无专用提示 | 左/右/全外连接 | 保留主表数据,高效补NULL |
| 笛卡尔连接 | USE_HASH(无条件) |
无连接条件的CROSS JOIN |
谨慎优化超大结果集 |
| Grace/Hybrid Hash | 自动触发 | 驱动表超出内存限制 | 分阶段处理,平衡内存与磁盘I/O |
⚠️ 8.注意事项
- 内存限制:
- 若驱动表过大(如几十GB),需开启并行(
PARALLEL)或拆分SQL,避免磁盘溢出(Temp表空间I/O瓶颈) - 监控
PGA_AGGREGATE_TARGET,确保内存充足
- 若驱动表过大(如几十GB),需开启并行(
- 数据倾斜:
- 连接键分布不均时,Grace Hash可能效率下降,可尝试重分布数据
- 非等值连接限制:
- Hash Join 仅支持等值条件(
=),非等值(如BETWEEN)会退化为Sort Merge或Nested Loop
- Hash Join 仅支持等值条件(
- 统计信息准确性:
- 优化器依赖统计信息选择Join算法,需定期收集(
DBMS_STATS.GATHER_TABLE_STATS)
- 优化器依赖统计信息选择Join算法,需定期收集(
9. 使用案例
9.1 两表join
9.2 多于两表join
💎10.总结
Oracle的Hash Join通过内存哈希表优化等值连接,其变体覆盖了反连接(HASH_AJ)、半连接(HASH_SJ)、外连接等场景
核心策略是:
- 小表驱动:优先将小表装入内存构建哈希表
- 内存优先:避免磁盘溢出(
workarea_size_policy = AUTO) - 子查询优化:反/半连接替代
NOT IN/EXISTS,效率提升显著
- 实际应用中需结合统计信息、内存配置及SQL语义综合选择,方可达最优性能。
posted on
浙公网安备 33010602011771号