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

在PolarDB索引的cardinality都是11117为什么join 评估的行数只有285?

在PolarDB索引的cardinality都是 11117 为什么join 评估的行数只有 285?lQLPJxYmjDJbzufM8c0Fa7B3FmnUvXbzWwWOTr0yvhoA_1387_241.png
317bc3ead416b54b12afac63dcf19b13.png

展开
收起
三分钟热度的鱼 2024-01-17 21:14:36 41 0
2 条回答
写回答
取消 提交回答
  • 在数据库优化器中,JOIN操作的成本估算和执行计划生成是非常复杂的,涉及到多个因素,包括但不限于索引的选择性(Cardinality)、表的实际数据分布、统计信息的准确性、JOIN条件的筛选力度、数据冗余、查询过滤条件、JOIN类型(如Nested Loop Join、Hash Join、Merge Join等)等因素。

    尽管索引的Cardinality(基数)表示的是索引列中不重复值的数量,但它只是估计行数的一个依据,而非精确的行数。在JOIN操作中,特别是当JOIN条件不仅仅是基于索引列时,优化器还会综合考虑JOIN条件带来的过滤效果,即通过JOIN条件能匹配多少行。

    假设PolarDB数据库中,即使两张表参与JOIN的索引Cardinality均为11117,但在JOIN条件的作用下,可能只有部分行才能相互匹配。也就是说,实际执行JOIN操作时,可能只有285行符合JOIN条件的要求。数据库优化器正是基于现有的统计信息和JOIN条件做出这一估算,以制定最优的执行计划。

    如果在具体场景中遇到这种情况,建议通过以下方式进行排查和优化:

    1. 检查JOIN条件是否足够严格,是否有效地缩小了结果集。
    2. 查看数据库的统计信息是否准确且是最新的,过时的统计信息可能导致估算偏差。
    3. 使用EXPLAINANALYZE等工具查看优化器如何估算JOIN成本,并查看执行计划详情。
    4. 更新统计信息,确保数据库能够获得最新的数据分布情况。
    5. 如果估算严重偏离实际情况,可能需要手动调整JOIN策略,或者采用hint等方式指导优化器选择合适的执行计划。
    2024-01-24 16:27:56
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在数据库中,索引的基数(Cardinality)代表的是索引的唯一值数量。而Join评估的行数则是Join算子输出的中间结果集的大小,它是由所有Join Reorder算法进行顺序选择的重要依据。所以,如果Join评估的行数比索引的基数小,可能的原因有:

    1. 查询条件过滤:在实际执行查询时,可能会有一些过滤条件下调实际参与计算的数据量,导致Join的中间结果集变小。
    2. 优化器的选择:优化器在选择执行计划时,可能会根据统计信息和代价模型来估算各种操作的开销,包括Join操作。如果优化器认为某些Join操作的结果集较小,则可能优先选择这些操作,从而使得实际执行的Join操作的结果集较小。
    3. PolarDB的特性:PolarDB是基于Parallel Raft一致性协议的分布式存储集群,计算引擎可以由1~16个分布在不同服务器上的计算节点构成,存储容量最高可达100 TB,最高支持120核920 GB内存,可在线动态扩容存储和计算资源。这种特性可能也会影响到Join评估的行数。
    2024-01-18 13:30:04
    赞同 展开评论 打赏

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

相关电子书

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