开发者社区 > PolarDB开源 > PolarDB 分布式版 > 正文

在PolarDB中,join 的时候对右表行的估算以下问题如何解决?

在PolarDB中,关于join 的时候对右表行的估算问题,ebie.sourcebillid>0 这种非关联条件是不起作用的吗? 例如实际左表中的关联字段在右表中都没有也不会估算,只是按右表的数据分布来估算吗?

展开
收起
花开富贵111 2024-01-08 15:32:08 62 0
3 条回答
写回答
取消 提交回答
  • 在PolarDB中,对于join操作,系统会采用拉取内表(通常是数据量较小的一边)的全部数据,缓存到内存中。接着遍历外表数据,针对外表中的每一行数据,和内表做比较,构造结果行,检查是否满足JOIN条件,如果满足条件则输出。此外,如果左表的JOIN Key较小,则消费左表的下一条数据。如果右表的JOIN Key较小,则消费右表的下一条数据。如果左右表JOIN Key相等,说明获得了1条或多条匹配,检查是否满足JOIN条件并输出。

    对于非关联条件的处理,例如 "ebie.sourcebillid>0" 这样的条件,它肯定是起作用的。在执行join操作时,系统会首先通过这类条件对右表进行筛选,缩小处理范围后,再与左表进行join操作。

    至于右表中关联字段在左表中没有也不会估算的问题。当使用LEFT JOIN(左连接)时,系统会返回左表中的所有记录,以及右表中与左表记录相关的匹配记录。即使在右表中不存在对应的关联字段,也不会影响查询的结果。因此,即使右表中的关联字段在左表中没有,也不会影响join操作的执行。

    2024-01-09 09:43:53
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    问题一:在PolarDB中,对于join操作,非关联条件如ebie.sourcebillid>0是起作用的。在进行join操作时,系统会先根据join条件进行筛选,然后再进行行估算和连接操作。因此,非关联条件会影响join操作的结果集大小和性能。

    问题二:在PolarDB中,如果左表中的关联字段在右表中没有对应的列,那么系统无法进行有效的行估算。此时,系统会根据右表的数据分布来进行估算,但这种估算可能不准确,导致实际执行时的性能与预期不符。为了获得更准确的行估算结果,建议在join操作中使用正确的关联字段。

    2024-01-08 20:44:38
    赞同 展开评论 打赏
  • 在PolarDB中,对于JOIN操作的执行计划优化和行数估算,MySQL和PostgreSQL等数据库管理系统通常遵循以下原则:

    问题一:
    ebie.sourcebillid > 0 这种非关联条件并不会直接对JOIN操作中的右表进行过滤。如果这个条件是在JOIN子句之外或者JOIN条件列表里没有包括,则它会在JOIN结果生成之后作为WHERE子句的一部分来过滤结果集。也就是说,在JOIN阶段不会基于这个条件减少参与JOIN的右表行数。

    但是,现代优化器如PolarDB所采用的可能会尝试根据可用统计信息及成本模型来进行查询优化,包括考虑将这类条件下推到JOIN操作之前(即所谓的“条件传递”或"Predicate Pushdown"),从而减少JOIN过程的数据量。具体是否有效,依赖于SQL的具体写法、表的索引情况以及优化器策略。

    问题二:
    关于JOIN时对右表行数的估算,即使左表中的关联字段在右表中没有任何匹配项,优化器仍然会根据右表的相关统计信息来估算可能返回的行数。这些统计信息包括但不限于表的基数、索引分布、直方图等。当JOIN条件存在时,优化器会尽量估计由于关联条件导致的行数减少,但如果没有有效的统计信息支持精确估算,它可能会保守地按照全表扫描或者索引扫描的成本来进行估算。

    PolarDB的优化器会尽可能提供一个准确且高效的执行计划,但在某些情况下可能需要手动调整SQL语句、更新统计信息或者设置hint以帮助优化器做出最优决策。
    image.png

    2024-01-08 16:21:54
    赞同 展开评论 打赏

PolarDB 分布式版 (PolarDB for Xscale,简称“PolarDB-X”) 是阿里云自主设计研发的高性能云原生分布式数据库产品,为用户提供高吞吐、大存储、低延时、易扩展和超高可用的云时代数据库服务。

相关电子书

更多
云栖大会:开源 PolarDB 架构演进、关键技术与社区建设 立即下载
2023云栖大会:和客户一起玩转PolarDB新特性 立即下载
2023云栖大会:PolarDB for AI 立即下载