Оптимизация соединения с перекосом с использованием подсказок
Важно
Эта документация выведена из обращения и может не обновляться. Продукты, службы или технологии, упомянутые в этом контенте, больше не поддерживаются.
Подсказки по соединению Skew не требуются. Databricks обрабатывает отклонение по умолчанию с помощью адаптивного выполнения запросов (AQE). См. "Адаптивное выполнение запросов" .
Заметка
spark.sql.adaptive.skewJoin.enabled
должен быть True
, который является параметром по умолчанию в Azure Databricks.
Что такое отклонение данных?
Отклонение данных — это условие, в котором данные таблицы неравномерно распределяются между секциями в кластере. Отклонение данных может существенно снизить производительность запросов, особенно при соединениях. Соединения между большими таблицами требуют перетасовки данных и сбой может привести к крайнему дисбалансу работы в кластере. Вероятно, что отклонение данных влияет на запрос, если он зависает на выполнении очень малого количества задач (например, последних 3 из 200). Чтобы убедиться, что отклонение данных влияет на запрос:
- Щелкните на шаге, который застрял, и убедитесь, что он выполняет соединение.
- После завершения запроса найдите этап соединения и проверьте распределение длительности задачи.
- Сортируйте задачи, уменьшая длительность и проверяя первые несколько задач. Если для выполнения одной задачи потребовалось гораздо больше времени, чем в других задачах, возникает отклонение.
Чтобы улучшить отклонение, Delta Lake в Azure Databricks SQL принимает подсказки в запросах. Благодаря информации из подсказки о перекосе Databricks Runtime может создать лучший план запроса, который не подвержен перекосу данных.
Настройка указания на отклонение с именем отношения
Указание на отклонение должно содержать по крайней мере имя отношения с отклонением. Отношение — это таблица, представление или вложенный запрос. Все соединения с этим отношением затем используют оптимизацию присоединения с отклонением.
-- table with skew
SELECT /*+ SKEW('orders') */
*
FROM orders, customers
WHERE c_custId = o_custId
-- subquery with skew
SELECT /*+ SKEW('C1') */
*
FROM (SELECT * FROM customers WHERE c_custId < 100) C1, orders
WHERE C1.c_custId = o_custId
Настройка указания на отклонение с именами реляционных имен и столбцов
Может быть несколько соединений с отношением, но только некоторые из них будут испытывать перекос. Оптимизация соединения с отклонением имеет некоторые издержки, поэтому лучше использовать его только при необходимости. Для этой цели подсказка смещения принимает имена столбцов. Только соединения с этими столбцами используют оптимизацию скошенного соединения.
-- single column
SELECT /*+ SKEW('orders', 'o_custId') */
*
FROM orders, customers
WHERE o_custId = c_custId
-- multiple columns
SELECT /*+ SKEW('orders', ('o_custId', 'o_storeRegionId')) */
*
FROM orders, customers
WHERE o_custId = c_custId AND o_storeRegionId = c_regionId
Настройка указания на отклонение с именем отношения, именами столбцов и значениями отклонений
Можно также указать значения отклонений в подсказке. В зависимости от запроса и данных значения отклонений могут быть известны (например, потому что они никогда не изменяются) или могут быть легко выяснить. Это снижает затраты на оптимизацию соединения с отклонением. В противном случае Delta Lake автоматически обнаруживает их.
-- single column, single skew value
SELECT /*+ SKEW('orders', 'o_custId', 0) */
*
FROM orders, customers
WHERE o_custId = c_custId
-- single column, multiple skew values
SELECT /*+ SKEW('orders', 'o_custId', (0, 1, 2)) */
*
FROM orders, customers
WHERE o_custId = c_custId
-- multiple columns, multiple skew values
SELECT /*+ SKEW('orders', ('o_custId', 'o_storeRegionId'), ((0, 1001), (1, 1002))) */
*
FROM orders, customers
WHERE o_custId = c_custId AND o_storeRegionId = c_regionId