Управление правилами 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
| Критерий | RBO | CBO |
|---|---|---|
| Основа принятия решений | Эвристические правила | Статистика данных (оценка стоимости) |
| Зависимость от статистики | Нет | Да |
| Сценарии применения | Универсальная, детерминированная оптимизация | Оптимизация, тесно связанная с распределением данных |
Управление с помощью USE_CBO_RULE | Нет | Да |
Итоги
При правильном использовании подсказка USE_CBO_RULE позволяет вручную включать расширенные правила оптимизации CBO в конкретных сценариях для повышения производительности запросов. Для её эффективного применения необходимо глубоко понимать оптимизацию запросов и характеристики данных. В большинстве случаев лучшим выбором по-прежнему остаётся полагаться на автоматические решения оптимизатора Doris.