在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' ;
在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';
通过查看执行计划,可以分析查询的性能瓶颈,并针对性地进行优化。
在PolarDB中,如果一条join条件都不满足,那么rows会显示为全表行数。这是因为在执行join操作时,系统会先根据join条件进行筛选,然后再进行行估算和连接操作。如果没有任何一条join条件满足,那么系统无法进行有效的行估算,因此会返回全表的行数。
在你提供的查询中,a表实际上没有与ebie表进行任何join操作,因为所有的join条件都不满足。因此,rows会显示为全表行数。
您这个条件 ebie.profileid=200005518 and ebie.sourcebillid>0 为什么不放在 WHERE后面呢?放在ON 中会把 ebie.profileid 和 ebie.sourcebillid 为NULL 的数据也返回。此回答整理来自钉群“PolarDB 专家面对面 - 慢SQL索引选择优化器新特性”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
PolarDB 分布式版 (PolarDB for Xscale,简称“PolarDB-X”) 是阿里云自主设计研发的高性能云原生分布式数据库产品,为用户提供高吞吐、大存储、低延时、易扩展和超高可用的云时代数据库服务。