1. 测试背景与问题定义
最近在数据库性能优化工作中,发现一个有趣的现象:Oracle的HASH JOIN半连接(SEMI JOIN)和反连接(ANTI JOIN)操作存在一种"刹车机制"。当驱动表的所有匹配行都找到后,Oracle会提前终止被驱动表的扫描。这种机制能显著减少I/O操作和CPU消耗,尤其在大表关联场景下效果更为明显。
为了验证这一特性,我设计了一组对比测试:
- 测试环境:Oracle 19c vs 崖山23.5.1
- 测试数据:
- TEST02:8万行数据(来自DBA_OBJECTS)
- TEST01:TEST02重复512次,约4500万行
- 关键点:两表均不创建索引,强制走HASH JOIN
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 半连接刹车机制深度解析
2.1 Oracle的半连接执行计划分析
执行以下SQL并检查执行计划:
sql复制select count(*)
from test02 a
where exists (select null from test01 b where a.object_id = b.object_id);
Oracle的执行计划关键指标:
code复制| Id | Operation | Name | Starts | E-Rows | A-Rows | Buffers |
|-----|---------------------|--------|--------|--------|--------|---------|
| 2 | HASH JOIN SEMI | | 1 | 86987 | 86987 | 4518 |
| 4 | TABLE ACCESS FULL | TEST01 | 1 | 44M| 228K| 3267 |
关键发现:
- TEST01实际扫描行数(A-Rows)仅22.8万行,远小于总行数4500万
- 逻辑读(Buffers)仅4518次,说明没有全表扫描
- 执行时间仅0.02秒
原理说明:Oracle的HASH JOIN SEMI会在内存中构建驱动表(TEST02)的哈希表,当被驱动表(TEST01)的扫
