Почему 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
,