`IndexCost::le` 尽管名字上是严格的 `<`,但其成本矩阵文档与代码有所偏离
作者: yuhao-su创建于 2026年9月16日更新于 2026年9月18日
标签type/refactorA-optimizer
IndexCost::le是一个严格的<。在所有四个调用位置(select_index_access_path中的三个,streaming_index_selection_rule.rs中的一个),min_cost都以primary_cost为种子:
- 如果条件相等,则优先使用主表,即除非成本更低,否则不要使用索引;
IndexCost::new限制在maximum() = 10_000_000,而Default也是maximum()(无论估算器是否能分析谓词),因此在大型表中 - 无谓词乘数为 4000,因此行大小 >= 2500 会饱和 - 主表和 每个 索引都落在 10,000,000 处。严格的<就是使规划器在该位置回退到基表的原因。使用<=,每个索引都会在上限处相等,选择会退化为目录顺序,成本模型则贡献不了任何东西。
内容来源: risingwavelabs/risingwave