关于 OceanBase 在执行 Hash Join 时使用 Bloom Filter 进行优化的描述,以下正确的是?

A. Bloom Filter 在 Hash Join 中用于加速探测端(Probe 端)的匹配过程,通过提前过滤掉不可能匹配的行,减少探测阶段的开销,但可能产生误判(False Positive)。

B. OceanBase 默认在所有 Hash Join 中自动启用 Bloom Filter 优化,用户无法干预其行为。

C. Bloom Filter 只能用于等值连接的 Hash Join,对于非等值连接(如范围条件)无法使用,因为哈希函数无法处理范围条件。

D. 当 Build 端的行数远小于 Probe 端时,使用 Bloom Filter 反而会增加额外内存和计算开销,因此优化器不会在这种场景下选择使用 Bloom Filter。

解析
Bloom Filter 是一种空间高效的概率性数据结构,用于判断一个元素是否存在于集合中。在 Hash Join 中,先用 Build 端的连接键构建 Bloom Filter,然后对 Probe 端的数据进行过滤——如果 Bloom Filter 判断某行不在 Build 端,则该行一定不匹配,可以被提前过滤掉;如果判断存在,则仍需实际查哈希表确认(因为 Bloom Filter 可能误判,即假阳性)。这种优化能显著减少探测阶段对哈希表的访问次数,尤其适合 Build 端较大且 Probe 端也大的场景。

  • A 正确 :Bloom Filter 的核心特性是空间效率高但存在假阳性,无假阴性。
  • B 错误 :Bloom Filter 的启用由优化器根据代价模型自动决定,用户也可以通过 Hint(如 USE_BLOOM_FILTER )或系统变量 bloom_filter_enabled 进行控制。
  • C 错误 :Bloom Filter 只支持等值连接 (因为哈希函数只能处理等值条件),这是正确的,但 C 后半句“无法用于非等值连接”也是正确的,然而题目问的是“描述正确的是”,A 明显正确。C 虽然描述准确,但相比 A,A 更全面且关键。注意 C 的说法本身没错,但通常 Bloom Filter 也能用于 IN 子查询等场景,本质也是等值。不过 A 更贴近 Bloom Filter 在 Hash Join 中的具体作用。通常考试中会选 A。
  • D 错误 :当 Build 端很小时,Bloom Filter 的开销(构建和内存)相对于收益较小,优化器可能选择不使用 ,而不是“反而增加开销”导致一定更差。D 中“反而增加额外开销”表述不够准确,因为开销是存在的,但优化器会根据代价决定,不一定总是增加总开销。且 D 描述的场景下优化器的选择是“可能不使用”,但不会因为“增加额外开销”而绝对不用,因为有时仍可能使用。不过 A 是更标准的正确描述。

正确答案:A

答案是A

答案:A

C表述的特点是Hash Join的特点。
Bloom Filter 是 Runtime Filter 的其中一种,Runtime Filter 本身就是为优化 Hash Join 而生,所以 Bloom Filter 会完全继承 Hash Join 的特性。

C的问题是“Bloom Filter ”这个技术本身可能不止用在hash join这个地方。