2

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

我更深入地查看了 Flink 基本代码,并检查了当 calcite 评估/估计对象中查询的行数时。出于某种原因,对于任何表源,它总是返回100

实际上在 Flink 中,在创建程序计划的过程中,对于每一个转换后的规则,它都被TableEnvironment .runVolcanoPlanner 称为VolcanoPlanner类 。计划者尝试通过调用RelMetadataQuery .getRowCount来优化和计算一些估计

我通过创建一个失败的测试来重现该错误,该测试应该将 0 断言为关系表“S”的行数,但它始终返回 100。

为什么会这样?有人对这个问题有答案吗?

4

1 回答 1

1

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

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

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

于 2019-01-09T10:45:56.153 回答