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

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

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

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

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

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


person Salvatore Rapisarda    schedule 08.01.2019    source источник


Ответы (1)


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

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

Единственный способ ввести оценки количества элементов для таблиц - использовать ExternalCatalog.

person Fabian Hueske    schedule 09.01.2019