为什么 Flink SQL 对所有表使用 100 行的基数估计?

Why does Flink SQL use a cardinality estimate of 100 rows for all tables?

我不确定为什么在 中没有正确评估逻辑计划。

我更深入地查看了 Flink 基本代码,并检查了方解石 evaluate/estimate 对象中查询的行数。由于某种原因,对于任何 table 来源 ,它 returns 总是 100

其实在Flink中,在创建程序计划的过程中,对于每一个转换后的规则,都会调用VolcanoPlanner class by the TableEnvironment.runVolcanoPlanner. The planner try to optimise and calculate some estimation by calling RelMetadataQuery.getRowCount

我通过创建一个失败的 test 重现了错误,它应该断言 0 作为关系 table 'S' 的行数,但它 returns 总是 100。

为什么会这样?有人知道这个问题的答案吗?

在当前版本(1.7.1,2019 年 1 月)中,Flink 的关系 APIs(Table API 和 SQL)不尝试估计基表的基数。因此,方解石使用其默认值 100。

这对于过滤器和投影下推等基本优化非常有效,目前已经足够了,因为 Flink(还)不会重新排序连接。

为表注入基数估计的唯一方法是通过 ExternalCatalog