Почему Flink SQL использует оценку мощности в 100 строк для всех таблиц?

Я не был уверен, почему логический план не был правильно оценен в этом примере.

Я посмотрел более глубоко в базовом коде Flink и проверил это, когда кальцит оценивает / оценивает количество строк для запроса в объекте. По какой-то причине он всегда возвращает 100 для любого источника таблицы.

Фактически, во время создания плана программы в Flink для каждого преобразованного правила он вызывается классом VolcanoPlanner от TableEnvironment.runVolcanoPlanner. Планировщик пытается оптимизировать и рассчитать некоторую оценку, вызвав RelMetadataQuery.getRowCount

Я воспроизвел ошибку, создав неудачный тест, который должен утверждать 0 как количество строк для таблицы отношений 'S', но он всегда возвращает 100.

Почему это происходит? У кого-нибудь есть ответ на этот вопрос?

1 ответ

Решение

В текущей версии (1.7.1, январь 2019 г.) реляционные API-интерфейсы Flink (Table API и SQL) не пытаются оценить мощность базовых таблиц. Следовательно, Calcite использует значение по умолчанию, равное 100.

Это отлично работает для базовых оптимизаций, таких как фильтр и проекция, и в настоящее время достаточно, потому что Flink (пока) не меняет порядок соединений.

Единственный способ ввести оценки кардинальности для таблиц через ExternalCatalog,

Другие вопросы по тегам