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
.