Cost-based оптимизация#
CedrusData поддерживает несколько видов cost-based оптимизации запросов, описанных ниже. Для применения большинства описанных оптимизаций необходимо наличие актуальных статистик.
Планирование порядка Join#
CedrusData автоматически определяет оптимальный порядок выполнения операторов Join. Ключевая задача данной оптимизации — найти такой порядок выполнения Join, который порождает минимальные по размеру промежуточные отношения. В большинстве случаев именно такой порядок обеспечивает наименьшее потребление ресурсов и время выполнения запроса.
CedrusData поддерживает несколько алгоритмов планирования порядка Join.
Для изменения алгоритма вы можете использовать параметр конфигурации optimizer.join-reordering-strategy
или свойство сессии join_reordering_strategy.
Примечание
Алгоритмом по умолчанию является CEDRUSDATA_AUTOMATIC. Мы рекомендуем использовать данный алгоритм для всех промышленных сценариев.
CEDRUSDATA_AUTOMATIC— выбирает оптимальный порядок Join на основе статистик с помощью высокопроизводительного алгоритма DPHyp. По сравнению с оригинальным алгоритмом Trino алгоритм CedrusData позволяет оценивать большее количество альтернативных планов за меньшее время. Алгоритм также автоматически заменяет CROSS JOIN на Join с предикатом, где это возможно.AUTOMATIC— оригинальный алгоритм Trino, который выбирает оптимальный порядок Join на основе статистик путем полного перебора всех возможных альтернативных планов. Алгоритм также автоматически заменяет CROSS JOIN на Join с предикатом, где это возможно.ELIMINATE_CROSS_JOINS— автоматически заменяет CROSS JOIN на Join с предикатом, где это возможно, но не изменяет порядок операторов Join.NONE— не изменяет порядок Join и не заменяет CROSS JOIN на Join с предикатом даже при наличии такой возможности.
Выбор стратегии перераспределения данных для Join#
CedrusData выполняет операции Join путем создания hash-таблицы на основе данных из правого входа Join, и сопоставления с ней данных из левого входа Join. Данный алгоритм требует, чтобы обработка совпадающих строк слева и справа происходила на одном и том же узле. Чтобы обеспечить данное требование, CedrusData может использовать одну из двух стратегий:
BROADCAST— содержимое правого входа Join пересылается на все узлы CedrusData. Лучше подходит для запросов, где правых вход имеет относительно небольшой размер. Например, объединение большой таблицы фактов с небольшим измерением.PARTITIONED— содержимое левого и правого входов партиционируется на независимые части, которые перераспределяются в кластере в соответствии с условием Join. Лучше подходит для запросов, объединяющих две большие таблицы.
CedrusData поддерживает несколько алгоритмов выбора стратегии выполнения Join.
Для изменения алгоритма вы можете использовать параметр конфигурации join-distribution-type
или свойство сессии join_distribution_type.
AUTOMATIC(режим по умолчанию) — автоматически определяет оптимальную стратегию на основе статистик. Параметр конфигурацииjoin-max-broadcast-table-size(и свойство сессииjoin_max_broadcast_table_size) позволяет задать максимальный размер правого входа Join в байтах. При превышении данного размера для конкретного Join будет использована стратегияPARTITIONED. Значение данного параметра по умолчанию:100MB.BROADCAST— все Join в запросе будут использовать стратегиюBROADCAST.PARTITIONED— все Join в запросе будут использовать стратегиюPARTITIONED.
Режим оптимизации Cascades#
Выполнение ряда операций, таких как Join, Aggregation или Window, зачастую требует передачи данных между
узлами. В процессе планирования запроса оптимизатор Trino вставляет рядом с такими операторами специальный оператор
Exchange, который моделирует передачу данных между узлами. В дальнейшем Trino разбивает план запроса на несколько
фрагментов по границам Exchange.
По умолчанию оптимизатор Trino определяет местоположение операторов Exchange эвристически на основе требований
конкретного оператора, что во многих случаях приводит к неоптимальным планам.
В режиме оптимизации Cascades оптимизатор рассматривает всю совокупность операторов запроса для выбора наиболее
оптимальной расстановки операторов Exchange. Это позволяет оптимизатору во многих случаях снизить количество
фрагментов, необходимых для выполнения запроса, а также уменьшить количество передаваемых по сети данных. Совместно
это приводит к ускорению запросов с большим количеством операций Join, Aggregation и Window.
Для включения данного режима воспользуйтесь параметром конфигурации cedrusdata.optimizer.cascades-enabled или
свойством сессии cedrusdata_cascades_enabled.
Оптимизация предикатов#
CedrusData использует short-circuit алгоритм расчета предикатов, содержащих операторы AND и OR:
Обработка выражения
a AND b AND c AND ...останавливается при получении первого значенияfalseОбработка выражения
a OR b OR c OR ...останавливается при получении первого значенияtrue
CedrusData применяет cost-based оптимизацию на основе статистик, чтобы выбрать оптимальный порядок выполнения выражений в предикатах, чтобы минимизировать затраты CPU и иных ресурсов:
Для выражений типа
a AND bCedrusData ставит в начало предикаты с наименьшей селективностью (те, которые отфильтровывают наибольшее количество значений). Например, если по оценкам CedrusData селективность предикатаa— 50%, а селективностьb— 10%, то выражениеa AND bбудет автоматически переписано наb AND aДля выражений типа
a OR bCedrusData ставит в начало предикаты с наибольшей селективностью (те, которые отфильтровывают наименьшее количество значений) Например, если по оценкам CedrusData селективность предикатаa— 50%, а селективностьb— 10%, то выражениеa OR bне будет подвергнуто переписыванию
Оптимизация предикатов включена по умолчанию.
Для отключения оптимизации используйте параметр конфигурации cedrusdata.optimizer.cost-based-predicate-reorder-enabled или
свойство сессии cedrusdata_cost_based_predicate_reorder_enabled.