我不确定为什么在这个例子中没有正确评估逻辑计划。
我更深入地研究了 Flink 基本代码,并在方解石评估/估计对象中查询的行数时检查了这一点。出于某种原因,对于任何表源,它始终返回 100。
事实上,在 Flink 中,在程序计划创建过程中,对于每个转换的规则,它被 TableEnvironment.runVolcanoPlanner 称为 VolcanoPlanner 类。计划人员尝试通过调用 RelMetadataQuery.getRowCount 来优化和计算一些估计值。
我通过创建一个失败的测试来重现错误,该测试应该断言 0 作为关系表"S"的行计数,但它始终返回 100。
为什么会这样?有人对这个问题有答案吗?
在当前版本(1.7.1,2019 年 1 月)中,Flink 的关系 API(Table API 和 SQL)不会尝试估计基表的基数。因此,方解石使用其默认值 100。
这对于过滤器和投影下推等基本优化效果很好,目前已经足够了,因为 Flink (尚未)对连接进行重新排序。
为表注入基数估计的唯一方法是通过 ExternalCatalog
。