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

Настройка режима Shuffle для Join с помощью подсказок

Distribute Hint — это синтаксис подсказок Doris для ручного указания режима распределения данных правой таблицы в Join. Он позволяет переопределить выбор оптимизатора в отдельных сценариях, чтобы повысить производительность Join.

Что проверить перед настройкой:

  • Вы проверили текущий режим распределения данных Join с помощью EXPLAIN SHAPE PLAN.
  • Вы убедились, что в плане по умолчанию есть узкое место, снижающее производительность (например, для небольшой таблицы используется Shuffle, а для большой — Broadcast).
  • Вы знаете объёмы данных в обеих таблицах и можете определить, подходит ли Broadcast или Shuffle.
  • Подсказки используются только при профессиональной настройке производительности; при решении бизнес-задач ручное вмешательство не требуется.
Примечание

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

Синтаксис Distribute Hint​

Doris поддерживает две независимые подсказки Distribute Hint. Их необходимо размещать перед правой таблицей Join и заключать в квадратные скобки [].

Сравнение типов подсказок​

Тип подсказкиРежим распределения (DistributionSpec)Типичный сценарий примененияЗатраты на передачу данных
[shuffle]DistributionSpecHashОбе таблицы большие; данные перераспределяются по хешу Join KeyДанные обеих таблиц перераспределяются по ключу
[broadcast]DistributionSpecReplicatedПравая таблица небольшая и реплицируется на каждый узел BEПравая таблица полностью реплицируется на каждый узел BE

Совет: можно также сочетать Leading Hint с Distribute Hint, чтобы одновременно задать режим Shuffle. Подробнее см. в разделе Управление порядком Join с помощью Leading Hint.

Минимальный пример​

-- Force the right table to use Broadcast distribution
SELECT COUNT(*) FROM t2 JOIN [broadcast] t1 ON t1.c1 = t2.c2;

-- Force the right table to use Shuffle distribution
SELECT COUNT(*) FROM t2 JOIN [shuffle] t1 ON t1.c1 = t2.c2;

Пример: проверка действия подсказки с помощью EXPLAIN​

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

Шаг 1: просмотр плана выполнения по умолчанию​

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

Команда:

EXPLAIN SHAPE PLAN SELECT COUNT(*) FROM t1 JOIN t2 ON t1.c1 = t2.c2;

Описание: в плане по умолчанию для t2 используется DistributionSpecHash, то есть распределение Shuffle по хешу.

+----------------------------------------------------------------------------------+
| Explain String (Nereids Planner) |
+----------------------------------------------------------------------------------+
| PhysicalResultSink |
| --hashAgg [GLOBAL] |
| ----PhysicalDistribute [DistributionSpecGather] |
| ------hashAgg [LOCAL] |
| --------PhysicalProject |
| ----------hashJoin [INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=()|
| ------------PhysicalProject |
| --------------PhysicalOlapScan [t1] |
| ------------PhysicalDistribute [DistributionSpecHash] |
| --------------PhysicalProject |
| ----------------PhysicalOlapScan [t2] |
+----------------------------------------------------------------------------------+

Шаг 2: добавление подсказки [broadcast]​

Цель: изменить режим распределения правой таблицы t2 на Broadcast.

Команда:

EXPLAIN SHAPE PLAN SELECT COUNT(*) FROM t1 JOIN [broadcast] t2 ON t1.c1 = t2.c2;

Описание: в плане выполнения режим распределения для t2 меняется с DistributionSpecHash на DistributionSpecReplicated, что указывает на успешное применение подсказки.

+----------------------------------------------------------------------------------+
| Explain String (Nereids Planner) |
+----------------------------------------------------------------------------------+
| PhysicalResultSink |
| --hashAgg [GLOBAL] |
| ----PhysicalDistribute [DistributionSpecGather] |
| ------hashAgg [LOCAL] |
| --------PhysicalProject |
| ----------hashJoin [INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=()|
| ------------PhysicalProject |
| --------------PhysicalOlapScan [t1] |
| ------------PhysicalDistribute [DistributionSpecReplicated] |
| --------------PhysicalProject |
| ----------------PhysicalOlapScan [t2] |
+----------------------------------------------------------------------------------+

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

Q1: почему добавленная подсказка не действует?​

  • Убедитесь, что подсказка находится перед правой таблицей Join, например JOIN [broadcast] t1, а не перед левой таблицей.
  • С помощью EXPLAIN SHAPE PLAN проверьте, соответствует ли DistributionSpec узла PhysicalDistribute вашим ожиданиям.
  • Подсказки с синтаксическими ошибками (например, пропущенными скобками или опечатками) игнорируются без предупреждения. Проверьте синтаксис SQL.

Q2: когда использовать [broadcast], а когда [shuffle]?​

СценарийРекомендуемая подсказкаПричина
Правая таблица небольшая (например, таблица измерений)[broadcast]Позволяет избежать сетевых затрат на Shuffle большой таблицы
Обе таблицы большие, данные распределены равномерно[shuffle]Broadcast увеличивает затраты на передачу данных правой таблицы
Данные по Join Key распределены крайне неравномерно[broadcast]Позволяет избежать перегрузки отдельных узлов после Shuffle

Q3: нужно ли вручную указывать подсказку?​

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

Итоги​

Грамотное использование Distribute Hint позволяет оптимизировать режим Shuffle для операций Join и повысить производительность запросов. На практике рекомендуется сначала проанализировать план выполнения с помощью EXPLAIN SHAPE PLAN, а затем выбрать [shuffle] или [broadcast] с учётом объёма данных и особенностей их распределения.