有人知道OB的join支持哪些算法?

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】OB
【 使用版本 】V3/V4
【问题描述】有人知道OB的join支持哪些算法?比如:HASH、NLJ等 @论坛小助手

3 个赞

@论坛小助手

1 个赞

OceanBase 数据库支持以下几种联接算法:

  • Nested Loop Join (NLJ)
  • Hash Join (HJ)
  • Merge Join (MJ)

这些联接算法分别适用于不同的场景:

  • Nested Loop Join (NLJ): 可用于任意的联接条件。
  • Hash Join (HJ): 只适用于等值的联接条件。
  • Merge Join (MJ): 也只适用于等值的联接条件。

具体的使用场景和示例可以在文档中找到更详细的说明。

详情请参考:

  1. 联接算法
  2. JOIN
  3. 连接类型
1 个赞

就是这三种吗?我还以为有更多呢

OceanBase 支持的 JOIN 算法详解

OceanBase 数据库在查询执行过程中支持多种 JOIN 算法,以适应不同的数据规模、联接类型和查询条件。当前版本(4.2.0)主要支持以下三种联接算法:

1. 支持的 JOIN 算法类型

OceanBase 支持以下三种核心联接算法:

:white_check_mark: Nested Loop Join(NLJ)

  • 适用场景:小表驱动大表,或无法使用等值条件的非等值联接(如 ><)。
  • 特点:对于左表的每一行,在右表中逐行查找匹配项。
  • 优势:实现简单,适合嵌套循环结构;当内层表有高效索引时性能良好。
  • 局限:数据量大时性能较差,时间复杂度较高。

联接算法

:white_check_mark: Hash Join(HJ)

  • 适用场景:等值联接(EQUI JOIN),尤其是一大一小表之间的连接。
  • 工作原理
    1. 使用较小的表(Build Table)构建哈希表;
    2. 扫描较大的表(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;

Hash Join, Runtime Filter

:white_check_mark: Merge Join(MJ)

  • 适用场景:等值或非等值联接,但要求两个输入源已按联接键排序。
  • 工作方式:类似归并排序,双指针扫描两个有序流进行匹配。
  • 优点:对大规模有序数据集效率高。
  • 限制:如果输入未排序,优化器通常不会选择该算法。
  • 成本决策:优化器会尝试生成 Merge Join 计划,并基于代价模型决定是否采用。

Merge Join → 优化器什么时候选择 Merge Join

2. 不同 JOIN 类型支持的算法汇总

JOIN 类型 Nested Loop Join Hash Join Merge Join
INNER JOIN :white_check_mark: :white_check_mark: :white_check_mark:
LEFT JOIN :white_check_mark: :white_check_mark: :white_check_mark:
RIGHT JOIN :x: :white_check_mark: :white_check_mark:
FULL JOIN :x: :white_check_mark: :white_check_mark:
LEFT SEMI JOIN :white_check_mark: :white_check_mark: :white_check_mark:
RIGHT SEMI JOIN :x: :white_check_mark: :white_check_mark:
LEFT ANTI JOIN :white_check_mark: :white_check_mark: :white_check_mark:
RIGHT ANTI JOIN :x: :white_check_mark: :white_check_mark:

注:部分外联接(如 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 个赞