【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】OB
【 使用版本 】V3/V4
【问题描述】有人知道OB的join支持哪些算法?比如:HASH、NLJ等 @论坛小助手
3 个赞
OceanBase 数据库支持以下几种联接算法:
- Nested Loop Join (NLJ)
- Hash Join (HJ)
- Merge Join (MJ)
这些联接算法分别适用于不同的场景:
- Nested Loop Join (NLJ): 可用于任意的联接条件。
- Hash Join (HJ): 只适用于等值的联接条件。
- Merge Join (MJ): 也只适用于等值的联接条件。
具体的使用场景和示例可以在文档中找到更详细的说明。
详情请参考:
1 个赞
就是这三种吗?我还以为有更多呢
OceanBase 支持的 JOIN 算法详解
OceanBase 数据库在查询执行过程中支持多种 JOIN 算法,以适应不同的数据规模、联接类型和查询条件。当前版本(4.2.0)主要支持以下三种联接算法:
1. 支持的 JOIN 算法类型
OceanBase 支持以下三种核心联接算法:
Nested Loop Join(NLJ)
-
适用场景:小表驱动大表,或无法使用等值条件的非等值联接(如
>
、<
)。 - 特点:对于左表的每一行,在右表中逐行查找匹配项。
- 优势:实现简单,适合嵌套循环结构;当内层表有高效索引时性能良好。
- 局限:数据量大时性能较差,时间复杂度较高。
Hash Join(HJ)
- 适用场景:等值联接(EQUI JOIN),尤其是一大一小表之间的连接。
-
工作原理:
- 使用较小的表(Build Table)构建哈希表;
- 扫描较大的表(Probe Table),通过哈希查找匹配行。
- 内存管理:若 Build Table 过大无法放入内存,OceanBase 会将其分区处理,每个分区独立完成 Hash Join。
- 性能提示:通常比其他算法效率更高,尤其适合大数据集等值连接。
- 优化机制:支持 Runtime Filter(RF),可在 Probe 阶段提前过滤不满足条件的数据块,显著提升性能。
-
Hint 支持:可通过
/*+ USE_HASH(table_name_list) */
强制使用 Hash Join。
-- 示例:强制使用 Hash Join
EXPLAIN SELECT /*+USE_HASH(t1, t2)*/ * FROM t1, t2 WHERE t1.c1 = t2.c1;
Merge Join(MJ)
- 适用场景:等值或非等值联接,但要求两个输入源已按联接键排序。
- 工作方式:类似归并排序,双指针扫描两个有序流进行匹配。
- 优点:对大规模有序数据集效率高。
- 限制:如果输入未排序,优化器通常不会选择该算法。
- 成本决策:优化器会尝试生成 Merge Join 计划,并基于代价模型决定是否采用。
2. 不同 JOIN 类型支持的算法汇总
JOIN 类型 | Nested Loop Join | Hash Join | Merge Join |
---|---|---|---|
INNER JOIN | ![]() |
![]() |
![]() |
LEFT JOIN | ![]() |
![]() |
![]() |
RIGHT JOIN | ![]() |
![]() |
![]() |
FULL JOIN | ![]() |
![]() |
![]() |
LEFT SEMI JOIN | ![]() |
![]() |
![]() |
RIGHT SEMI JOIN | ![]() |
![]() |
![]() |
LEFT ANTI JOIN | ![]() |
![]() |
![]() |
RIGHT ANTI JOIN | ![]() |
![]() |
![]() |
注:部分外联接(如 RIGHT 和 FULL)不支持 Nested Loop Join,因其逻辑方向性限制。
3. 如何查看与控制 JOIN 算法
查看执行计划
使用 EXPLAIN
命令查看实际使用的 JOIN 算法:
EXPLAIN SELECT * FROM t1, t2 WHERE t1.c = t2.c;
输出中的 OPERATOR
列将显示:
HASH JOIN
MERGE JOIN
NESTED LOOP JOIN
使用 Hint 强制指定算法
可使用 Hint 控制优化器选择特定算法:
-- 强制使用 Hash Join
SELECT /*+ USE_HASH(t1, t2) */ * FROM t1, t2 WHERE t1.c = t2.c;
-- 强制使用 Merge Join(如支持)
SELECT /*+ USE_MERGE(t1, t2) */ * FROM t1, t2 WHERE t1.c = t2.c;
1 个赞
nlj,mj,hj就这几种吧
1 个赞
学习了
1 个赞
嗯嗯
1 个赞
一起学习
1 个赞