Перейти к основному содержимому
Версия: 2.0.x

Skew Join V2

Skew Join V2 — это продвинутая функция оптимизации в Selena, которая решает проблемы перекоса данных (data skew) в операциях JOIN путём broadcast-передачи «перекошенных» значений. Эта функция значительно улучшает производительность запросов при работе с сильно неравномерным распределением данных.

Обзор

Перекос данных возникает, когда определённые значения в столбцах объединения встречаются гораздо чаще других, что приводит к неравномерному распределению данных между узлами и вызывает узкие места производительности. Skew Join V2 решает эту проблему следующим образом:

  1. Определение перекошенных значений: Ручное указание значений, вызывающих перекос данных
  2. Broadcast-передача перекошенных значений: Передача этих конкретных значений на все узлы для обеспечения равномерного распределения данных
  3. Гибридное выполнение: Использование комбинации shuffle- и broadcast-соединений для оптимальной производительности

Skew Join V2 создаёт гибридный план выполнения, который объединяет:

  1. Shuffle Join: Для обычных данных используется стандартное соединение на основе shuffle
  2. Broadcast Join: Для перекошенных значений данные правой таблицы передаются на все узлы

Включение Skew Join V2

По умолчанию оптимизация Skew Join V2 отключена, а её предшественник, Skew Join V1, включён. Если вы обнаружите, что производительность Skew Join V1 неудовлетворительна, необходимо отключить Skew Join V1 перед включением Skew Join V2.

-- Отключение Skew Join V1
SET enable_optimize_skew_join_v1 = false;

-- Включение Skew Join V2
SET enable_optimize_skew_join_v2 = true;

После включения Skew Join V2 вы можете обновить свои запросы на основе синтаксиса с явно указанными перекошенными значениями.

примечание

В настоящее время Skew Join V2 не поддерживает автоматическое переписывание плана на основе статистики. Поддерживается только ручное переписывание SQL на основе подсказок (hint).

Использование

По сравнению с методом переписывания запросов Skew Join V1, Skew Join V2 предлагает новый синтаксис, позволяющий явно указывать перекошенные значения с использованием Broadcast.

Синтаксис:

SELECT select_list FROM
table1 JOIN [skew|table1.column(skew_value1, skew_value2, ...)] table2
ON join_condition
[WHERE where_clause]

Параметры:

[skew|table1.column(skew_value1, skew_value2, ...)]: Подсказка skew. Она включает:

  • table1.column: Столбец из левой таблицы, содержащий перекошенные значения.
  • skew_value1, skew_value2, ...: Список значений через запятую, вызывающих перекос данных.
примечание

Не опускайте скобки в подсказке skew.

Примеры

Базовое использование

  1. Создайте тестовые таблицы.

    CREATE TABLE orders (
    order_id INT,
    customer_id INT,
    order_date DATE,
    amount DECIMAL(10,2)
    ) DUPLICATE KEY(order_id)
    DISTRIBUTED BY HASH(order_id) BUCKETS 8;

    CREATE TABLE customers (
    customer_id INT,
    customer_name VARCHAR(100),
    city VARCHAR(50)
    ) DUPLICATE KEY(customer_id)
    DISTRIBUTED BY HASH(customer_id) BUCKETS 8;
  2. Вставьте образцы данных с перекосом.

    INSERT INTO orders VALUES
    (1, 1001, '2024-01-01', 100.00),
    (2, 1001, '2024-01-02', 200.00),
    (3, 1001, '2024-01-03', 150.00),
    (4, 1002, '2024-01-01', 300.00),
    (5, 1003, '2024-01-01', 250.00);

    INSERT INTO customers VALUES
    (1001, 'John Doe', 'New York'),
    (1002, 'Jane Smith', 'Los Angeles'),
    (1003, 'Bob Johnson', 'Chicago');
  3. Запросите данные с использованием Skew Join V2.

    SELECT o.order_id, c.customer_name, o.amount
    FROM orders o
    JOIN [skew|o.customer_id(1001)] c
    ON o.customer_id = c.customer_id;

Несколько перекошенных значений

Skew Join V2 поддерживает несколько перекошенных значений.

SELECT o.order_id, c.customer_name, o.amount
FROM orders o
JOIN [skew|o.customer_id(1001, 1002, 1003)] c
ON o.customer_id = c.customer_id;

Различные типы данных

Skew Join V2 поддерживает различные типы данных для перекошенных значений.

-- Строковые значения
SELECT t1.id, t2.name
FROM table1 t1
JOIN [skew|t1.category('electronics', 'clothing', 'books')] t2
ON t1.category = t2.category;

-- Значения даты
SELECT t1.id, t2.event_name
FROM events t1
JOIN [skew|t1.event_date('2024-01-01', '2024-01-02')] t2
ON t1.event_date = t2.event_date;

-- Числовые значения
SELECT t1.id, t2.region
FROM sales t1
JOIN [skew|t1.region_id(1, 2, 3)] t2
ON t1.region_id = t2.region_id;

Сложные условия соединения

Skew Join V2 поддерживает сложные условия соединения.

-- Условие соединения со сложными выражениями
SELECT t1.id, t2.value
FROM table1 t1
JOIN [skew|t1.key(abs(t1.key))] t2
ON abs(t1.key) = abs(t2.key);

-- Множественные условия соединения
SELECT t1.id, t2.name
FROM table1 t1
JOIN [skew|t1.category('electronics')] t2
ON t1.category = t2.category AND t1.region = t2.region;

Различные типы соединений

Skew Join V2 поддерживает различные типы соединений.

-- Left Join
SELECT t1.id, t2.name
FROM table1 t1
LEFT JOIN [skew|t1.category('electronics')] t2
ON t1.category = t2.category;

-- Left Semi Join
SELECT t1.id
FROM table1 t1
LEFT SEMI JOIN [skew|t1.category('electronics')] t2
ON t1.category = t2.category;

-- Left Anti Join
SELECT t1.id
FROM table1 t1
LEFT ANTI JOIN [skew|t1.category('electronics')] t2
ON t1.category = t2.category;

Лучшие практики

Шаг 1. Определите перекошенные значения

Перед использованием Skew Join V2 определите значения, вызывающие перекос данных:

-- Анализ распределения данных
SELECT customer_id, COUNT(*) as cnt
FROM orders
GROUP BY customer_id
ORDER BY cnt DESC
LIMIT 10;

Шаг 2. Выберите подходящие перекошенные значения

Следуйте этим правилам при выборе подходящих перекошенных значений:

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

Ограничения

  • Поддерживаемые типы соединений В настоящее время поддерживаются только INNER JOIN, LEFT JOIN, LEFT SEMI JOIN и LEFT ANTI JOIN.
  • Типы данных В настоящее время поддерживаются только базовые типы данных (INT, BIGINT, STRING, DATE, DATETIME и строковые типы).
  • Сложные выражения Поддержка сложных выражений в условиях соединения ограничена.
  • Таблица с перекосом Skew Join V2 может обрабатывать только сценарии, когда большая таблица в операции JOIN имеет перекос, и эта большая таблица должна использоваться как левая таблица.
  • Переупорядочивание соединений Использование подсказки skew предотвращает переупорядочивание соединений оптимизатором. Соединение будет выполняться в порядке, указанном в SQL, и оптимизатор не будет пытаться изменить порядок соединений или поменять местами левую и правую таблицы узла соединения, содержащего подсказку.

Устранение неполадок

Отладочная информация

Выполните EXPLAIN VERBOSE для запроса, чтобы получить его план выполнения:

EXPLAIN VERBOSE
SELECT ... FROM ... JOIN [skew|...] ...;

Проверьте следующие поля в плане:

  • SplitCastDataSink: Разделение данных.
  • BROADCAST и SHUFFLE: Тип распределения.
  • UNION: Объединение результатов обоих типов соединений.

Связанные темы