为什么连接条件为空

在这个执行计划的Outputs & filters部分, conds的值为什么为nil而不是“t1.c1 = t2.d1”呢?

5 个赞

@社区小助手 回答一下

@论坛小助手 请解答一下

为什么连接条件为空

根据您提供的执行计划和 SQL 语句,conds 值为 nil 而不是 t1.c1 = t2.d1 的原因可能与以下几个因素有关:

  1. Hint 使用规则

    • 根据文档片段 1 中的示例,对于没有指定 Query Block 的 Hint,表明作用于本 Query Block。如果优化器无法通过改写 SQL 将某个表提升到最外层的 Query Block,则 Hint 可能无法生效。
    • 在您的 SQL 语句中,使用了 /*+ use_nl(t1, t2) */ Hint 来强制使用嵌套循环连接(Nested-Loop Join)。如果优化器没有将 t2 表提升到最外层的 Query Block,那么该 Hint 可能没有生效。
  2. SQL 语句中的错误

    • 您的 SQL 语句中有拼写错误:where ti.cl = 应该是 where t1.c1 = t2.d1。这个拼写错误可能导致优化器无法正确识别连接条件。
    • 修正后的 SQL 语句应为:
      explain select /*+ use_nl(t1, t2) */ t1.c2 + t2.d2 from t1, t2 where t1.c1 = t2.d1;
      
  3. 执行计划输出

    • 在执行计划的 Outputs & filters 部分,conds(nil) 表示没有显式的连接条件。这可能是由于优化器没有正确应用 Hint 或者 SQL 语句中的拼写错误导致的。
  4. 优化器行为

    • 优化器在某些情况下可能会忽略 Hint,特别是在 Hint 无法被正确应用时。例如,如果优化器认为其他连接方式(如哈希连接或合并连接)更优,它可能会忽略 use_nl Hint。

结论

  • 请检查并修正 SQL 语句中的拼写错误。
  • 重新运行解释计划,并查看 conds 是否仍然为 nil
  • 如果问题仍然存在,建议进一步检查 Hint 是否被优化器正确应用,或者尝试其他 Hint 看看是否能解决问题。

希望这些信息对您有所帮助。如果问题仍然存在,请提供更多详细信息以便进一步诊断。

检索到的文档如下:

  1. 阅读和管理 OceanBase 数据库 SQL 执行计划
1 个赞

你好,你提的这个技术问题牵涉到OceanBase企业版范围内的功能细节;针对此类问题,建议你通过以下方式寻求帮助:

  1. 如你所在的企业客户已签署OceanBase企业版销售合同,请你联系客户经理;

  2. 如你所在的企业客户尚未签署OceanBase企业版销售合同,你可通过OceanBase官网商务咨询页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。

另外,我们欢迎你使用社区版,并在论坛/社群中分享你对社区版本的想法、经验和问题,与其他社区成员共同交流。

1 个赞


@论坛小助手 在MySQL租户下,已经指定它走nested loop join了,但是它却走出来 hash jion,解答一下。

1 个赞

根据您提供的信息,在 MySQL 租户下使用 /*+use nl(t1, t2)*/ Hint 试图指定执行 Nested Loop Join,但实际执行计划中却选择了 Hash Join。这种现象的发生可能是由于以下几个原因:\n1. 在 OceanBase 数据库中,当使用 USE_NL Hint 指定表作为连接右表时,该表必须是连接的右侧表才能生效。在您的 SQL 语句中,Hint 是 /*+use nl(t1, t2)*/,这意在指示对 t1 join t2 或者 t2 join t1 都尝试使用 Nested Loop Join,但实际上这个用法可能不正确或没有明确指出哪一个作为驱动表。\n2. 为了明确指定哪张表作为驱动表以及哪张作为被驱动表(即保证一个特定表作为连接的右表),您可以结合 LEADING Hint 来进一步限定表之间的顺序。例如,如果您希望 t2 为驱动表而 t1 为右表,则应采用如下方式写 Hint: /*+LEADING(t2 t1) USE_NL(t1)*/。这样不仅明确了表的先后顺序,还确保了 USE_NL 被应用到正确的场景中。\n3. 另外,请检查相关表的统计信息是否最新、准确,因为优化器的选择会基于这些信息做出判断。如果统计信息与实际情况偏差较大,可能会导致优化器忽略了 Hint 并选择了一个它认为成本更低的方案。

具体信息可参考以下文档:

  1. 阅读和管理 OceanBase 数据库 SQL 执行计划
  2. Hint

你这个hint 有问题
解析时会把 use_nl(t1,t2) 拆成两个独立 hint:

  • use_nl(t1):仅当 t1 是 join 的右表(被驱动表) 时生效
  • use_nl(t2):仅当 t2 是 join 的右表 时生效

可以这样试一下
SELECT /*+ leading(t1 t2) use_nl(t1 t2) */
t1.c2 + t2.d2
FROM t1, t2
WHERE t1.c2 = t2.d2;

图片

可以看看hint是否生效
explain extended 全部发一下

看着hint没有生效呀 这样执行一下

SELECT /*+leading(t1 t2) use_nl(t2) */t1.c2 + t2.d2 FROM t1, t2 WHERE t1.c2 = t2.d2;

666

t1.c2 = t2.d2 没有消失,只是被优化器识别为等值连接条件,展示在 equal_conds 中;other_conds(nil) 表示没有非等值连接条件,这是正确且符合设计的。 看着是依旧没有生效 好奇怪

优化器认为走hash join成本更低? 就忽略了hint ?

签到…

官方解答一下

mysql模式 是社区版哪个版本

内容详实,观点独到,值得一读。