Оптимизация неравномерного объединения

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

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

Чтобы предназначено асимметрию, Дельта 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

Настройка подсказки о неравномерном сопоставлении с именем связи, именами столбцов и значениями смещения

В подсказке можно также указать значения наклона. В зависимости от запроса и данных значения смещения могут быть известны (например, так как они никогда не изменяются) или могут быть легко найдены. Это снижает затраты на оптимизацию неравномерного объединения. В противном случае дельта 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