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


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

Важно

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

Подсказки по соединению 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