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 b CedrusData ставит в начало предикаты с наименьшей селективностью (те, которые отфильтровывают наибольшее количество значений). Например, если по оценкам CedrusData селективность предиката a — 50%, а селективность b — 10%, то выражение a AND b будет автоматически переписано на b AND a

  • Для выражений типа a OR b CedrusData ставит в начало предикаты с наибольшей селективностью (те, которые отфильтровывают наименьшее количество значений) Например, если по оценкам CedrusData селективность предиката a — 50%, а селективность b — 10%, то выражение a OR b не будет подвергнуто переписыванию

Оптимизация предикатов включена по умолчанию. Для отключения оптимизации используйте параметр конфигурации cedrusdata.optimizer.cost-based-predicate-reorder-enabled или свойство сессии cedrusdata_cost_based_predicate_reorder_enabled.