Оптимизатор запросов#

Оптимизатор CedrusData отвечает за преобразование пользовательского SQL-запроса в распределенный план выполнения. CedrusData поддерживает большое количество продвинутых оптимизаций, включая cost-based планирование порядка Join, упрощение outer join, удаление повторяющихся подпланов, упрощение операторов, и т.д.

Данный документ содержит настройки, влияющие на стратегию оптимизации запросов.

Оптимизация Join#

optimizer.join-reordering-strategy#

  • Тип: string

  • Допустимые значения: CEDRUSDATA_AUTOMATIC, AUTOMATIC, ELIMINATE_CROSS_JOINS, NONE

  • Значение по умолчанию: CEDRUSDATA_AUTOMATIC

  • Свойство сессии: join_reordering_strategy

Стратегия выбора оптимального порядка Join.

Примечание

Алгоритмом по умолчанию является 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 с предикатом даже при наличии такой возможности.

optimizer.max-reordered-joins#

  • Тип: integer

  • Значение по умолчанию: -1 (использовать значение 11 для CEDRUSDATA_AUTOMATIC или 8 для AUTOMATIC)

  • Свойство сессии: max_reordered_joins

Определяет максимальную сложность графа Join, для которого может быть рассчитан оптимальный порядок Join. Используется для cost-based стратегий выбора оптимального порядка Join CEDRUSDATA_AUTOMATIC и AUTOMATIC. Для стратегий ELIMINATE_CROSS_JOINS и NONE значение данного параметра будет проигнорировано.

Выбор оптимального порядка Join в общем случае обладает экспоненциальной сложностью. Поэтому оптимизатор ограничивает максимальный размер графа, для которого может быть одномоментно рассчитан оптимальный порядок. Оптимизатор разбивает запрос на один или более непересекающихся графов в зависимости от значения параметра optimizer.max-reordered-joins, после чего для каждого графа происходит независимый выбор оптимального порядка Join.

Обработка данного параметра отличается для стратегий CEDRUSDATA_AUTOMATIC и AUTOMATIC.

Стратегия CEDRUSDATA_AUTOMATIC строит граф связей Join и исследует только такие комбинаций Join, в которых отсутствует cross-join. Таким образом, количество планов-кандидатов и время планирования порядка Join зависит от количества связей между таблицами. Абсолютное количество связей можно рассчитать для типичных топологий графа, таких как chain и star. В аналитических приложениях часто встречаются запросы типа star и starflake. При использовании стратегии параметр optimizer.max-reordered-joins задает два ограничения: максимальное количество Join в графе и максимальное количество связей между таблицами, если бы пользовательский запрос имел топологию звезда. Подграф будет спланирован целиком, если количество Join в нем не превосходит значение параметра optimizer.max-reordered-joins, либо если количество связей в графе не превосходит количество связей в запросе с топологией звезда и количеством Join равным значению optimizer.max-reordered-joins. Это позволяет стратегии CEDRUSDATA_AUTOMATIC планировать подграфы, количество Join в которых превосходит значение параметра optimizer.max-reordered-joins.

Стратегия AUTOMATIC находит оптимальный порядок путем полного перебора всех возможных комбинаций. Данный алгоритм является значительно менее эффективным, чем CEDRUSDATA_AUTOMATIC и поэтому не может планировать большое количество Join одновременно. При использовании данной стратегии параметр optimizer.max-reordered-joins задает максимальное количество Join в подграфе.

Выбор значения по умолчанию происходит в зависимости от стратегии выбора оптимального порядка Join: 11 для CEDRUSDATA_AUTOMATIC, 8 для AUTOMATIC. Мы не рекомендуем увеличивать значения данного параметра, так как это может привести к значительному увеличению времени планирования Join.

cedrusdata.optimizer.join-pruning-enabled#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: cedrusdata_join_pruning_enabled

Включает автоматическое удаление неиспользуемых операторов Join из запроса. В процессе работы оптимизатор заменяет неиспользуемый Join на одну из сторон Join, к которой могут быть применены дополнительные трансформации (проекция или фильтрация) для обеспечения эквивалентности результатов запроса. Замена возможна в следующем случае:

  • Запрос не использует атрибуты удаляемой стороны Join, или же они могут быть заменены атрибутами оставшейся стороны.

  • Удаляемая сторона не имеет дополнительных предикатов или же может быть создать эквивалентный предикат поверх оставшейся стороны.

  • Удаляемые сторона не является противоположной к null-producing стороне Join. Это означает, что в запросе a LEFT OUTER JOIN b может быть удалена только сторона b, в запросе a RIGHT OUTER JOIN b может быть удалена только сторона a, а в запросе a FULL OUTER JOIN b не может быть удалена ни одна сторона.

  • Запрос гарантированно не увеличивает количество записей оставшейся стороны. Для обеспечения данного условия необходимо задать PRIMARY KEY или UNIQUE constraint на удаляемой стороне и FOREIGN KEY constraint на противоположной стороне.

Для работы данной оптимизации необходимо указать примененные к таблицам ограничения (constraints) с помощью параметра конфигурации cedrusdata.optimizer.constraint.file или свойства сессии cedrusdata_constraints. См. {ref}(cedrusdata-constraints).

Для максимального упрощения запросов постарайтесь задать как можно больше PRIMARY KEY, UNIQUE и FOREIGN KEY ограничений, а так же NOT NULL ограничений на колонках, используемых в левой части FOREIGN KEY.

Например, следующий запрос может быть автоматически упрощен оптимизатором:

SET SESSION cedrusdata_constraints = ARRAY[
  'PRIMARY KEY example.tpch.part(partkey)',
  'PRIMARY KEY example.tpch.supplier(suppkey)',
  'FOREIGN KEY example.tpch.partsupp(partkey) REFERENCES example.tpch.part(partkey)',
  'FOREIGN KEY example.tpch.partsupp(suppkey) REFERENCES example.tpch.supplier(suppkey)'
];

SELECT p_name, COUNT(*)
FROM example.tpch.partsupp
  INNER JOIN example.tpch.part ON ps_partkey = p_partkey
  INNER JOIN example.tpch.supplier ON ps_suppkey = s_suppkey
WHERE p_retailprice > 100
GROUP BY p_name

Упрощенный запрос после оптимизации:

SELECT p_name, COUNT(*)
FROM example.tpch.partsupp
  INNER JOIN example.tpch.part ON ps_partkey = p_partkey
WHERE p_retailprice > 100 AND ps_suppkey IS NOT NULL
GROUP BY p_name

cedrusdata.optimizer.join-pruning-constraint-file#

  • Тип: string

  • Значение по умолчанию: null

Задает путь к файлу, который содержит описание ограничений (constraints), примененных к таблицам. Например:

cedrusdata.optimizer.constraint.file=/path/to/file

Каждая строка файла представляет собой отдельное ограничение в одном из следующих форматов:

PRIMARY KEY table(список_колонок)
UNIQUE имя_таблицы(список_колонок)
FOREIGN KEY имя_таблицы(список_колонок) REFERENCES имя_таблицы(список_колонок)
имя_таблицы(список_колонок) NOT NULL

Имя таблицы должно быть задано в fully-qualified формате каталог.схема.таблица. Имена колонок должны быть разделены запятой. Например:

PRIMARY KEY example.tpch.partsupp(partkey, suppkey)
FOREIGN KEY example.tpch.lineitem(partkey, suppkey) REFERENCES example.tpch.partsupp(partkey, suppkey)
example.tpch.nation(regionkey) NOT NULL

Обновлять содержимое файла можно без перезагрузки узла, задав параметр конфигурации cedrusdata.optimizer.constraint.file.refresh-period.

Можно переопределить ограничения с помощью свойства сессии cedrusdata_constraints. Например:

SET SESSION cedrusdata_constraints = ARRAY[
  'PRIMARY KEY example.tpch.part(partkey)',
  'PRIMARY KEY example.tpch.supplier(suppkey)',
  'FOREIGN KEY example.tpch.partsupp(partkey) REFERENCES example.tpch.part(partkey)',
  'FOREIGN KEY example.tpch.partsupp(suppkey) REFERENCES example.tpch.supplier(suppkey)'
];

cedrusdata.optimizer.join-pruning-constraint-file-refresh-period#

  • Тип: duration

  • Значение по умолчанию: null (перечитывание файла отключено)

Задает частоту повторного чтения файла с ограничениями, заданного с помощью параметра конфигурации cedrusdata.optimizer.constraint.file. Например:

cedrusdata.optimizer.constraint.file=/path/to/file
cedrusdata.optimizer.constraint.file.refresh-period=1m

cedrusdata.optimizer.simplify-outer-joins#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: cedrusdata_simplify_outer_joins

Преобразовывать outer join в inner join. Упрощение возможно, если оптимизатор может доказать, что удаление части результатов из Join не повлияет на конечный результат. Обычно это возможно, когда над Join имеется фильтр, заведомо отбрасывающий строки, в которых определенных атрибут равен NULL.

Возможные преобразования:

  • FULL OUTER JOIN -> LEFT OUTER JOIN

  • FULL OUTER JOIN -> RIGHT OUTER JOIN

  • FULL OUTER JOIN -> INNER JOIN

  • LEFT OUTER JOIN -> INNER JOIN

  • RIGHT OUTER JOIN -> INNER JOIN

Рассмотрим запрос:

SELECT store.name
FROM store
  LEFT OUTER JOIN address ON store.address_id = address.id
WHERE address.zip = '191131'

LEFT OUTER JOIN может вернуть строки из таблицы store, у которых нет совпадающих значений в таблицы address. В таких строках колонка address.zip будет иметь значение NULL. Последующий фильтр address.zip = '191131' заведомо отбрасывает подобные строки. Поэтому Join может быть упрощен:

SELECT store.name
FROM store
  INNER JOIN address ON store.address_id = address.id
WHERE address.zip = '191131'

cedrusdata.optimizer.simplify-outer-join-for-merge#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: cedrusdata_simplify_outer_join_for_merge

Преобразовывать outer join в inner join при оптимизации оператора MERGE. Допустимо, когда MERGE не имеет ветки NOT MATCHED.

optimizer.join-partitioned-build-min-row-count#

  • Тип: integer

  • Значение по умолчанию: 1000000

  • Минимальное значение: 0

  • Свойство сессии: join_partitioned_build_min_row_count

Минимальное количество строк build-стороны join, при котором используется партиционированный lookup в хэш-таблице join. Если оценочное количество строк build-стороны join меньше заданного порога, используется однопоточный lookup для повышения производительности join. Значение 0 отключает данную оптимизацию.

optimizer.optimize-duplicate-insensitive-joins#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: optimize_duplicate_insensitive_joins

Сокращает количество строк, порождаемых join, когда оптимизатор определяет, что дублирующиеся строки результата join могут быть пропущены.

Оптимизация агрегаций#

cedrusdata.optimizer.force-push-partial-aggregation-through-join#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: cedrusdata_force_push_partial_aggregation_through_join

Принудительно осуществляет pushdown частичной агрегации (partial aggregation) под join, если такое преобразование допустимо.

cedrusdata.optimizer.simplify-aggregation-key#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: cedrusdata_simplify_aggregation_key

Упрощать ключ агрегации, если оптимизатор может доказать, что результат останется неизменным. Данная оптимизация возможна, когда один ключ агрегации может быть выражен через другой. Например:

  • GROUP BY a, 1 может быть заменен на GROUP BY a с последующим добавлением константы 1 к результату агрегации

  • GROUP BY a, concat(a, '_suffix') может быть заменен на GROUP BY a с последующим добавлением concat к результату агрегации

  • GROUP BY a, b, a+b может быть заменен на GROUP BY a, b с последующим добавлением a+b к результату агрегации.

cedrusdata.optimizer.push-pre-grouped-symbols-to-partial-aggregation#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: cedrusdata_push_pre_grouped_symbols_to_partial_aggregation

Переносить ли уже предсгруппированные символы в частичную агрегацию (partial aggregation). Предсгруппированные символы — это ключи агрегации, для которых оптимизатор смог доказать, что реальной группировки по ним происходить не будет. Это происходит, когда значения ключа идентичны среди всех входных строк, либо значения ключа полностью определены другими ключами.

Когда данный флаг включен, информация о предсгруппированных символах будет передана в частичную агрегацию в момент разделения однофазного агрегата на частичный и финальный. Это может ускорить выполнение частичного агрегата.

optimizer.dictionary-aggregation#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: dictionary_aggregation

Включает оптимизацию агрегаций над словарными блоками (dictionary blocks).

optimizer.optimize-metadata-queries#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: optimize_metadata_queries

Включает оптимизацию некоторых агрегаций с использованием значений, хранящихся в метаданных. Это позволяет выполнять некоторые простые запросы за константное время. В настоящий момент оптимизация применяется к функциям max, min и approx_distinct над ключами партиций, а также к другим агрегациям, нечувствительным к кардинальности входных данных, включая DISTINCT-агрегации.

Основной недостаток: оптимизация может выдать некорректные результаты, если коннектор возвращает ключи партиций для партиций, в которых отсутствуют строки. В частности, коннектор Hive может возвращать пустые партиции, если они были созданы другими системами. CedrusData не создает пустых партиций.

optimizer.distinct-aggregations-strategy#

  • Тип: string

  • Допустимые значения: AUTOMATIC, MARK_DISTINCT, SINGLE_STEP, PRE_AGGREGATE, SPLIT_TO_SUBQUERIES

  • Значение по умолчанию: AUTOMATIC

  • Свойство сессии: distinct_aggregations_strategy

Стратегия вычисления множественных distinct-агрегаций.

  • SINGLE_STEP — вычисляет distinct-агрегации за один шаг без предварительной агрегации. Данная стратегия работает неэффективно при малом количестве уникальных значений группирующих ключей.

  • MARK_DISTINCT — использует оператор MarkDistinct для множественных distinct-агрегаций или для комбинации distinct- и обычных агрегаций.

  • PRE_AGGREGATE — вычисляет distinct-агрегации путем комбинации агрегации и предварительной агрегации.

  • SPLIT_TO_SUBQUERIES — разбивает входные данные агрегации на независимые подзапросы, каждый из которых вычисляет одну distinct-агрегацию, повышая параллелизм.

  • AUTOMATIC — автоматически выбирает стратегию. Предпочтение отдается SINGLE_STEP, однако при ограниченном параллелизме из-за малого количества уникальных значений группирующих ключей выбирается альтернативная стратегия на основе статистик входных данных.

optimizer.push-aggregation-through-outer-join#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: push_aggregation_through_outer_join

Если агрегация располагается над outer join и все колонки внешней стороны join присутствуют в группирующем выражении, происходит pushdown агрегации под outer join. Данная оптимизация особенно полезна для коррелированных скалярных подзапросов, которые переписываются в агрегацию над outer join. Например:

SELECT * FROM item i
    WHERE i.i_current_price > (
        SELECT AVG(j.i_current_price) FROM item j
            WHERE i.i_category = j.i_category);

Включение данной оптимизации может значительно ускорить запросы за счет сокращения объема данных, обрабатываемых join. Однако она может замедлить запросы с высокоселективными join.

Оптимизация set-операторов (UNION, INTERSECT, EXCEPT)#

cedrusdata.optimizer.simplify-set-operators-with-global-aggregation#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: cedrusdata_simplify_set_operators_with_global_aggregation

Упрощать UNION ALL, когда все его входы представляют собой глобальные агрегации из одной и той же таблицы. В таком случае UNION ALL будет заменен на однократное чтение из целевой таблицы с последующим расчетом всех агрегатов.

cedrusdata.optimizer.simplify-set-operators-with-distinct-aggregation#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: cedrusdata_simplify_set_operators_with_distinct_aggregation

Заменяет смежные операторы UNION/INTERSECT/EXCEPT на скан таблицы с фильтром, если все входы операторов читают из одной таблицы, и оптимизатор может доказать, что наличие дублирующих записей не влияет на результат запроса.

cedrusdata.optimizer.simplify-set-operators-with-grouping-sets#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: cedrusdata_simplify_set_operators_with_grouping_sets

Заменяет UNION ALL, в котором входы отличаются только ключом группировки, на однократное чтение входа с последующим расчетом всех необходимых агрегатов.

cedrusdata.optimizer.simplify-set-operators-with-non-intersecting-predicates#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: cedrusdata_simplify_set_operators_with_non_intersecting_predicates

Заменяет UNION ALL, в котором входы читают данные из одной и той же таблицы, и гарантированно возвращают непересекающиеся результаты, на однократное чтение из целевой таблицы.

Оптимизация Exchange#

optimizer.use-table-scan-node-partitioning#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: use_table_scan_node_partitioning

Использовать предоставляемое коннектором партиционирование таблицы при чтении данных. Например, для Hive партиционирование таблицы соответствует бакетированию (bucketing). Если значение равно true и выполняется минимальное соотношение партиций к задачам, каждая партиция таблицы читается отдельным worker-узлом. Минимальное соотношение задается параметром optimizer.table-scan-node-partitioning-min-bucket-to-task-ratio.

Распределение чтения партиций по worker-узлам обеспечивает параллельную обработку. Использование партиционирования при сканировании может повысить производительность запроса за счет снижения его сложности — например, может не потребоваться перераспределение данных при выполнении агрегации. Однако параллелизм запроса может снижаться, если количество партиций мало по сравнению с количеством worker-узлов.

optimizer.table-scan-node-partitioning-min-bucket-to-task-ratio#

  • Тип: double

  • Значение по умолчанию: 0.5

  • Свойство сессии: table_scan_node_partitioning_min_bucket_to_task_ratio

Задает минимальное соотношение количества бакетов к количеству задач, при достижении которого используется партиционирование при сканировании таблицы. Если количество бакетов таблицы мало по сравнению с количеством worker-узлов, сканирование распределяется по всем worker-узлам для повышения параллелизма.

optimizer.colocated-joins-enabled#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: colocated_join

Использовать co-located join, когда обе стороны join имеют одинаковое партиционирование по ключам join и выполняются условия для optimizer.use-table-scan-node-partitioning. Например, join на бакетированных таблицах Hive с совпадающими схемами бакетирования может избежать обмена данными между worker-узлами, повышая производительность запроса.

cedrusdata.propagate-preferred-distribution-through-replicated-join#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: cedrusdata_propagate_preferred_distribution_through_replicated_join

Пробрасывать требования к партиционированию из вышестоящих операторов через replicated Join. Включение данного параметра может снизить количество exchange, требуемых для выполнения запроса.

optimizer.use-cost-based-partitioning#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: use_cost_based_partitioning

Включает использование cost-based оптимизатора для определения необходимости перераспределения данных стадии, которая уже имеет партиционирование.

optimizer.use-exact-partitioning#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: use_exact_partitioning

Принудительно выполнять перераспределение данных (repartition), если партиционирование вышестоящей стадии не полностью соответствует ожиданиям нижестоящей стадии.

Управление статистиками#

optimizer.filter-conjunction-independence-factor#

  • Тип: double

  • Значение по умолчанию: 0.75

  • Минимальное значение: 0

  • Максимальное значение: 1

  • Свойство сессии: filter_conjunction_independence_factor

Задает степень независимости предикатов конъюнкции. Меньшие значения дают более консервативные оценки селективности, предполагая большую степень корреляции между колонками предикатов в конъюнкции. Значение 0 означает, что оптимизатор предполагает полную корреляцию колонок, и селективность конъюнкции определяется только наиболее селективным предикатом.

optimizer.join-multi-clause-independence-factor#

  • Тип: double

  • Значение по умолчанию: 0.25

  • Минимальное значение: 0

  • Максимальное значение: 1

  • Свойство сессии: join_multi_clause_independence_factor

Задает степень независимости предикатов join. Меньшие значения дают более консервативные оценки селективности, предполагая большую степень корреляции между колонками условий join. Значение 0 означает, что оптимизатор предполагает полную корреляцию колонок, и селективность join определяется только наиболее селективным предикатом.

optimizer.non-estimatable-predicate-approximation.enabled#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: non_estimatable_predicate_approximation_enabled

Включает аппроксимацию количества выходных строк для фильтров, кардинальность которых не может быть точно оценена даже при наличии полных статистик. Это позволяет оптимизатору строить более эффективные планы при наличии сложных фильтров.

cedrusdata.optimizer.non-estimatable-equijoin-approximation.enabled#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: non_estimatable_equijoin_approximation_enabled

Включает аппроксимацию количества выходных строк для equi-join, кардинальность которого не может быть точно оценена даже при наличии полных статистик. Это позволяет оптимизатору строить более эффективные планы при наличии сложных фильтров.

Материализованные представления#

CedrusData позволяет автоматически заменять части запроса на сканирование материализованных представлений. В настоящее время оптимизация поддерживается только для материализованных представлений в Iceberg.

cedrusdata.optimizer.materialized-view-rewrite.enabled#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: cedrusdata_materialized_views_rewrite_enabled

Включает автоматическое переписывание запросов на материализованные представления.

cedrusdata.optimizer.materialized-view-rewrite.logger-level#

  • Тип: string

  • Значение по умолчанию: null (логирование отключено)

  • Свойство сессии: cedrusdata_materialized_views_logger_level

Задает уровень логирования для операции подстановки материализованных представлений. Допустимые значения: INFO, TRACE.

Разное#

cedrusdata.optimizer.cost-based-predicate-reorder-enabled#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: cedrusdata_cost_based_predicate_reorder_enabled

Автоматически переставлять предикаты конъюнкции в соответствии с их селективностью. Позволяет быстрее отбрасывать строки при фильтрации, снижая потребление CPU.

cedrusdata.optimizer.deduplicate-row-expressions#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: cedrusdata_deduplicate_row_expressions

Включает дедупликацию повторяющихся выражений в операторе Project. Приводит к уменьшению потребления CPU.

cedrusdata.optimizer.predicate-pushdown-infer-additional-filters#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: cedrusdata_predicate_pushdown_infer_additional_filters

Выводит дополнительные фильтры, которые могут быть в дальнейшем переданы в операторы сканирования для уменьшения количества чтений при сканировании.

cedrusdata.optimizer.rewrite-like-to-comparison#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: cedrusdata_rewrite_like_to_comparison

Заменяет LIKE на сравнение, если это возможно. Например, c LIKE 'Mos% будет заменено на c >= 'Mos' AND c < 'Mot'

cedrusdata.optimizer.sarg-optimizer-enabled#

  • Тип: boolean

  • Значение по умолчанию: false

  • Свойство сессии: cedrusdata_sarg_optimizer_enabled

Выводит дополнительные предикаты для equi-join на основе анализа предикатов, примененных к колонкам equi-условия.

optimizer.push-table-write-through-union#

  • Тип: boolean

  • Значение по умолчанию: true

  • Свойство сессии: push_table_write_through_union

Включает параллельную запись данных при использовании UNION ALL в запросах, осуществляющих вставку данных. Это повышает скорость записи результирующих таблиц, так как операции записи не требуют дополнительной синхронизации при сборе результатов. Однако данная оптимизация может замедлить запросы в системе с высокой нагрузкой.

optimizer.push-filter-into-values-max-row-count#

  • Тип: integer

  • Значение по умолчанию: 100

  • Минимальное значение: 0

  • Свойство сессии: push_filter_into_values_max_row_count

Максимальное количество строк в VALUES, при котором планировщик вычисляет фильтр, примененный поверх VALUES, на этапе планирования для оптимизации плана запроса.

optimizer.min-input-size-per-task#

  • Тип: data size

  • Значение по умолчанию: 5GB

  • Минимальное значение: 0MB

  • Свойство сессии: min_input_size_per_task

Минимальный объем входных данных на один task. Данный параметр помогает оптимизатору определить количество хэш-партиций для join и агрегаций. Ограничение количества хэш-партиций для небольших запросов повышает конкурентность на больших кластерах, где одновременно выполняется множество небольших запросов. Рассчитанное значение всегда находится в диапазоне между свойствами сессии min_hash_partition_count и max_hash_partition_count. Значение 0MB отключает данную оптимизацию.

optimizer.min-input-rows-per-task#

  • Тип: integer

  • Значение по умолчанию: 10000000

  • Минимальное значение: 0

  • Свойство сессии: min_input_rows_per_task

Минимальное количество входных строк на один task. Данный параметр помогает оптимизатору определить количество хэш-партиций для join и агрегаций. Ограничение количества хэш-партиций для небольших запросов повышает конкурентность на больших кластерах, где одновременно выполняется множество небольших запросов. Рассчитанное значение всегда находится в диапазоне между свойствами сессии min_hash_partition_count и max_hash_partition_count. Значение 0 отключает данную оптимизацию.