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

在PolarDB中,为什么 a表实际上一条joint条件都不符合,但rows却是全表行数?

在PolarDB中请教一个索引问题,为什么 a表实际上一条joint条件都不符合,但rows却是全表行数?explain
select /+join_prefix(a) /
a.billid
FROM erp_bill_index a
left JOIN erp_bill_index_ext AS ebie
ON a.billid=ebie.sourcebillid and ebie.profileid=200005518 and ebie.sourcebillid>0 -- 待确认的预收款单
where a.profileid=200005518 AND a.billdate >= '2023-05-25' AND a.billdate < '2024-01-03' ;
5b10f3b77239b81afcdf5408fbe0cee2.png

展开
收起
花开富贵111 2024-01-08 15:27:15 54 0
3 条回答
写回答
取消 提交回答
  • 在PolarDB中,如果一条join条件都不符合,但rows却是全表行数,可能是因为查询条件过于宽松,导致所有行都被匹配到了。在这种情况下,可以使用EXPLAIN命令来查看查询的执行计划,以确定是否存在性能问题。

    根据您提供的查询语句,可以添加EXPLAIN关键字来查看执行计划:

    EXPLAIN
    SELECT /+join_prefix(a) /
    a.billid
    FROM erp_bill_index a
    LEFT JOIN erp_bill_index_ext AS ebie
    ON a.billid=ebie.sourcebillid and ebie.profileid=200005518 and ebie.sourcebillid>0 -- 待确认的预收款单
    WHERE a.profileid=200005518 AND a.billdate >= '2023-05-25' AND a.billdate < '2024-01-03';
    

    通过查看执行计划,可以分析查询的性能瓶颈,并针对性地进行优化。

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

    在PolarDB中,如果一条join条件都不满足,那么rows会显示为全表行数。这是因为在执行join操作时,系统会先根据join条件进行筛选,然后再进行行估算和连接操作。如果没有任何一条join条件满足,那么系统无法进行有效的行估算,因此会返回全表的行数。

    在你提供的查询中,a表实际上没有与ebie表进行任何join操作,因为所有的join条件都不满足。因此,rows会显示为全表行数。

    2024-01-08 20:44:38
    赞同 展开评论 打赏
  • 您这个条件 ebie.profileid=200005518 and ebie.sourcebillid>0 为什么不放在 WHERE后面呢?放在ON 中会把 ebie.profileid 和 ebie.sourcebillid 为NULL 的数据也返回。此回答整理来自钉群“PolarDB 专家面对面 - 慢SQL索引选择优化器新特性”

    2024-01-08 16:37:51
    赞同 展开评论 打赏

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

相关电子书

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