在PolarDB中,关于join 的时候对右表行的估算问题,ebie.sourcebillid>0 这种非关联条件是不起作用的吗? 例如实际左表中的关联字段在右表中都没有也不会估算,只是按右表的数据分布来估算吗?
在PolarDB中,对于join操作,系统会采用拉取内表(通常是数据量较小的一边)的全部数据,缓存到内存中。接着遍历外表数据,针对外表中的每一行数据,和内表做比较,构造结果行,检查是否满足JOIN条件,如果满足条件则输出。此外,如果左表的JOIN Key较小,则消费左表的下一条数据。如果右表的JOIN Key较小,则消费右表的下一条数据。如果左右表JOIN Key相等,说明获得了1条或多条匹配,检查是否满足JOIN条件并输出。
对于非关联条件的处理,例如 "ebie.sourcebillid>0" 这样的条件,它肯定是起作用的。在执行join操作时,系统会首先通过这类条件对右表进行筛选,缩小处理范围后,再与左表进行join操作。
至于右表中关联字段在左表中没有也不会估算的问题。当使用LEFT JOIN(左连接)时,系统会返回左表中的所有记录,以及右表中与左表记录相关的匹配记录。即使在右表中不存在对应的关联字段,也不会影响查询的结果。因此,即使右表中的关联字段在左表中没有,也不会影响join操作的执行。
问题一:在PolarDB中,对于join操作,非关联条件如ebie.sourcebillid>0是起作用的。在进行join操作时,系统会先根据join条件进行筛选,然后再进行行估算和连接操作。因此,非关联条件会影响join操作的结果集大小和性能。
问题二:在PolarDB中,如果左表中的关联字段在右表中没有对应的列,那么系统无法进行有效的行估算。此时,系统会根据右表的数据分布来进行估算,但这种估算可能不准确,导致实际执行时的性能与预期不符。为了获得更准确的行估算结果,建议在join操作中使用正确的关联字段。
在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以帮助优化器做出最优决策。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
PolarDB 分布式版 (PolarDB for Xscale,简称“PolarDB-X”) 采用 Shared-nothing 与存储计算分离架构,支持水平扩展、分布式事务、混合负载等能力,100%兼容MySQL。 2021年开源,开源历程及更多信息访问:OpenPolarDB.com/about