Перейти к содержимому
Последнее обновление

Управление правилами CBO с помощью подсказок для переписывания на основе стоимости

Что нужно знать перед чтением​

  • Вы понимаете основные этапы работы оптимизатора Doris
  • Вам нужно включить определённое правило CBO (например, проталкивание агрегации) для конкретного запроса
  • Вы DBA или специалист по настройке производительности, а не разработчик бизнес-приложений
Примечание

Doris предоставляет широкие возможности сразу после установки и адаптивно оптимизирует производительность в большинстве сценариев, поэтому ручная настройка с помощью подсказок требуется редко. Эта статья предназначена прежде всего для специалистов по настройке производительности. Бизнес-пользователям достаточно понимать основные принципы.

Обзор​

USE_CBO_RULE — это подсказка запроса, которая явно включает указанные правила переписывания CBO на основе стоимости в пределах одного оператора SQL.

При построении плана выполнения оптимизатор Doris применяет две категории правил:

Тип оптимизацииПолное названиеОснова принятия решенийТипичные стратегии
RBOОптимизатор на основе правилПредопределённые эвристические правила, не зависящие от статистикиПроталкивание предикатов, проталкивание проекций
CBOОптимизатор на основе стоимостиСтатистика данных, оценка и выбор плана с наименьшей стоимостьюВыбор пути доступа, выбор алгоритма соединения

В некоторых сценариях тонкой настройки DBA или разработчикам нужно вручную управлять включением правил CBO. Для этого можно использовать подсказку запроса.

Синтаксис​

Назначение: явно включить одно или несколько правил CBO в пределах одного оператора SELECT.

Команда:

SELECT /*+ USE_CBO_RULE(rule1, rule2, ...) */ ...

Примечания:

  • Подсказка указывается сразу после ключевого слова SELECT.
  • В скобках перечисляются имена правил, которые нужно включить. Если правил несколько, они разделяются запятыми.
  • Имена правил нечувствительны к регистру.

Поддерживаемые правила CBO​

В настоящее время оптимизатор Doris поддерживает следующие правила переписывания на основе стоимости, которые можно явно включить с помощью USE_CBO_RULE:

Имя правилаДействие
PUSH_DOWN_AGG_THROUGH_JOINПроталкивает операцию агрегации на обе стороны соединения
PUSH_DOWN_AGG_THROUGH_JOIN_ONE_SIDEПроталкивает операцию агрегации на одну сторону соединения
PUSH_DOWN_DISTINCT_THROUGH_JOINПроталкивает операцию Distinct через соединение

Практический пример: проталкивание агрегации для ускорения запросов с соединением​

Сценарий: таблица a соединяется с таблицей b по device_id, а результат агрегируется по event_id и group_id. Вы хотите агрегировать таблицу a до соединения, чтобы уменьшить объём данных, обрабатываемых при соединении.

Пример SQL:

explain shape plan
select /*+ USE_CBO_RULE(push_down_agg_through_join_one_side) */
a.event_id,
b.group_id,
COUNT(a.event_id)
from a
join b on
a.device_id = b.device_id
group by
a.event_id,
b.group_id
;

План выполнения после переписывания:

PhysicalResultSink
--hashAgg[GLOBAL]
----hashAgg[LOCAL]
------hashJoin[INNER_JOIN] hashCondition=((a.device_id = b.device_id)) otherCondition=()
--------hashAgg[LOCAL]
----------PhysicalOlapScan[a]
--------filter((cast(experiment_id as DOUBLE) = 73.0))
----------PhysicalOlapScan[b]

Как видно, над операцией сканирования таблицы добавлен ещё один hashAgg[LOCAL]. Для таблицы a он выполняет агрегацию до соединения. Это уменьшает объём входных данных для соединения и ускоряет запрос.

Часто задаваемые вопросы​

Вопрос 1: Когда требуется использовать USE_CBO_RULE?

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

Вопрос 2: Чувствительны ли имена правил в подсказке к регистру?

Нет, они нечувствительны к регистру. PUSH_DOWN_AGG_THROUGH_JOIN_ONE_SIDE и push_down_agg_through_join_one_side эквивалентны.

Вопрос 3: Можно ли включить несколько правил одновременно?

Да. Разделяйте правила запятыми, например: /*+ USE_CBO_RULE(rule1, rule2) */.

Вопрос 4: Что произойдёт, если подсказка указана в неправильном месте или в имени правила допущена опечатка?

Подсказка должна следовать сразу за ключевым словом SELECT. Если в имени правила допущена опечатка, подсказка не оказывает никакого действия, но SQL по-прежнему выполняется с использованием плана по умолчанию.

Сравнение RBO и CBO​

КритерийRBOCBO
Основа принятия решенийЭвристические правилаСтатистика данных (оценка стоимости)
Зависимость от статистикиНетДа
Сценарии примененияУниверсальная, детерминированная оптимизацияОптимизация, тесно связанная с распределением данных
Управление с помощью USE_CBO_RULEНетДа

Итоги​

При правильном использовании подсказка USE_CBO_RULE позволяет вручную включать расширенные правила оптимизации CBO в конкретных сценариях для повышения производительности запросов. Для её эффективного применения необходимо глубоко понимать оптимизацию запросов и характеристики данных. В большинстве случаев лучшим выбором по-прежнему остаётся полагаться на автоматические решения оптимизатора Doris.