Поделиться через


Оптимизация соединения с перекосом с использованием подсказок

Важно

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

Подсказки по соединению Skew не требуются. Databricks обрабатывает отклонение по умолчанию с помощью адаптивного выполнения запросов (AQE). См. "Адаптивное выполнение запросов" .

Заметка

spark.sql.adaptive.skewJoin.enabled должен быть True, который является параметром по умолчанию в Azure Databricks.

Что такое отклонение данных?

Отклонение данных — это условие, в котором данные таблицы неравномерно распределяются между секциями в кластере. Отклонение данных может существенно снизить производительность запросов, особенно при соединениях. Соединения между большими таблицами требуют перераспределения данных, и перекос может привести к значительному дисбалансу работы в кластере. Вероятно, что перекос данных влияет на запрос, если он, кажется, застревает после завершения очень малого числа задач (например, последних 3 из 200). Чтобы убедиться, что отклонение данных влияет на запрос:

  1. Щелкните на шаге, который застрял, и убедитесь, что он выполняет соединение.
  2. После завершения запроса найдите этап соединения и проверьте распределение длительности задачи.
  3. Сортируйте задачи, уменьшая длительность и проверяя первые несколько задач. Если для выполнения одной задачи потребовалось гораздо больше времени, чем в других задачах, возникает отклонение.

Чтобы улучшить отклонение, 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