Otimização de junção de inclinação usando dicas de inclinação

Este artigo descreve como usar dicas de distorção para melhorar a distorção de dados em uma tabela, uma condição que pode fazer downgrade do desempenho da consulta.

Nota

Não são necessárias dicas de junção inclinada. A distorção é automaticamente cuidada se a execução de consulta adaptável (AQE) e spark.sql.adaptive.skewJoin.enabled ambos estiverem habilitados. Consulte Execução de consulta adaptável.

O que é a distorção de dados?

A distorção de dados é uma condição em que os dados de uma tabela são distribuídos de forma desigual entre partições no cluster. A distorção de dados pode mudar gravemente o desempenho das consultas, especialmente as que têm associações. As junções entre grandes tabelas exigem embaralhamento de dados e a distorção pode levar a um desequilíbrio extremo do trabalho no cluster. É provável que a distorção de dados esteja afetando uma consulta se uma consulta parecer estar presa ao concluir poucas tarefas (por exemplo, as últimas 3 tarefas de 200). Para verificar se a distorção de dados está a afetar uma consulta:

  1. Clique no estágio que está preso e verifique se ele está fazendo uma junção.
  2. Após a conclusão da consulta, localize o estágio que faz uma junção e verifique a distribuição da duração da tarefa.
  3. Ordene as tarefas diminuindo a duração e verifique as primeiras tarefas. Se uma tarefa demorou muito mais tempo a ser concluída do que as outras tarefas, existe distorção.

Para melhorar a inclinação, o Delta Lake no Azure Databricks SQL aceita dicas de distorção em consultas. Com as informações de uma dica de inclinação, o Databricks Runtime pode construir um plano de consulta melhor, que não sofra de distorção de dados.

Configurar dica de distorção com nome de relação

Uma dica de inclinação deve conter pelo menos o nome da relação com a inclinação. Uma relação é uma tabela, vista ou subconsulta. Todas as juntas com essa relação, em seguida, use a otimização de junção inclinada.

-- 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

Configurar dica de inclinação com nome de relação e nomes de coluna

Pode haver várias uniões em um relacionamento e apenas algumas delas sofrerão de distorção. A otimização de junção inclinada tem alguma sobrecarga, por isso é melhor usá-la apenas quando necessário. Para isso, a dica de inclinação aceita nomes de coluna. Somente as junções com essas colunas usam otimização de junção inclinada.

-- 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

Configurar dica de inclinação com nome de relação, nomes de coluna e valores de inclinação

Você também pode especificar valores de distorção na dica. Dependendo da consulta e dos dados, os valores de distorção podem ser conhecidos (por exemplo, porque nunca mudam) ou podem ser fáceis de descobrir. Isso reduz a sobrecarga da otimização de junção inclinada. Caso contrário, o Delta Lake deteta-os automaticamente.

-- 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