问题1:云原生数据仓库AnalyticDB PostgreSQL中两张表都是100多万数据join,key也看了是唯一的,看执行计划怎么是 ROWS 是7亿呢?
问题2:为啥会预估这么大啊? 查询返回结果要40s,我用了 bitmap 函数。
在 AnalyticDB PostgreSQL 中,执行计划中的 "ROWS" 表示查询语句返回的估计行数。这个值是优化器根据统计信息和查询条件等因素进行估算的结果。
如果您在执行计划中看到 "ROWS" 值为 7亿,这意味着优化器估计该查询将返回大约 7亿行的结果。这仅仅是一个估计值,并不代表实际查询结果的确切行数。
在优化器生成执行计划时,它会基于表的统计信息、索引选择性和查询条件等数据来估计查询的行数。然而,由于统计信息可能不完全准确或查询条件复杂,实际返回的行数可能与预估值有所偏差。
如果您对查询的行数估计存在疑问,可以考虑以下操作:
更新统计信息:使用 ANALYZE
命令更新相关表的统计信息,以确保优化器具备最新的数据分布和索引选择性信息。
检查查询条件:确保查询条件正确且合理,它们可以帮助优化器更准确地估计行数。
执行实际查询:执行查询并观察实际返回的行数,以验证优化器的估计是否准确。
请注意,执行计划中的 "ROWS" 值只是一个估计值,实际结果可能会有所偏差。最终的返回行数受多个因素影响,包括数据分布、索引选择性、查询条件和集群负载等。
执行计划中的ROWS指的是执行计划中每个步骤(节点)处理的行数,而不是查询结果的总行数。因此,ROWS的值可能会受到多种因素的影响,例如查询的复杂度、索引的使用情况、数据分布等。
在您的情况下,如果两张表都是100多万数据,join的key也是唯一的,那么执行计划中ROWS为7亿可能是由于以下原因导致的:
数据分布不均衡:如果参与join的表数据分布不均衡,例如其中一张表的数据有很多重复,那么在join操作时会产生大量的中间结果,从而导致执行计划中ROWS的值变大。
未使用索引或索引失效:如果join的key没有建立索引或者索引失效,那么在执行join操作时需要进行全表扫描,从而导致执行计划中ROWS的值变大。
查询复杂度高:如果查询中包含复杂的子查询、聚合函数或者大量的计算,那么在执行计划中的每个步骤中处理的行数可能会变大,从而导致ROWS的值变大。
针对问题1的回答:那是估算。看后面的 9249。此回答整理自钉群“云原生数据仓库AnalyticDB PostgreSQL版交流群”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云自主研发的云原生数据仓库,具有高并发读写、低峰谷读写、弹性扩展、安全可靠等特性,可支持PB级别数据存储,可广泛应用于BI、机器学习、实时分析、数据挖掘等场景。包含AnalyticDB MySQL版、AnalyticDB PostgreSQL 版。