Compartilhar via


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

Importante

Esta documentação foi desativada e pode não estar atualizada. Não há mais suporte para os produtos, serviços ou tecnologias mencionados neste conteúdo.

Dicas de junção distorcida não são necessárias. O Databricks manipula a distorção por padrão usando a AQE (execução de consulta adaptável). Consulte Execução de consulta adaptável.

Observação

spark.sql.adaptive.skewJoin.enabled deve ser True, que é a configuração padrão no Azure Databricks.

O que é distorção de dados?

A distorção de dados é uma condição na qual os dados de uma tabela são distribuídos de modo não uniforme entre partições no cluster. A distorção de dados pode causar downgrade acentuado no desempenho de consultas, especialmente aquelas com junções. As junções entre tabelas grandes exigem o embaralhamento de dados, e a distorção pode gerar um desequilíbrio extremo no trabalho no cluster. É provável que a distorção de dados esteja afetando uma consulta que pareça estar paralisada, concluindo muito poucas tarefas (por exemplo, as últimas 3 tarefas de 200). Para verificar se a distorção de dados está afetando uma consulta:

  1. Clique no estágio travado e verifique se ele está fazendo alguma junção.
  2. Após a conclusão da consulta, localize o estágio que faz junção e verifique a distribuição de durações da tarefa.
  3. Classifique as tarefas por duração decrescente e verifique as iniciais. Se uma tarefa tiver demorado muito mais do que as outras para ser concluída, significa que há distorção.

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

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

Uma dica de distorção deve conter pelo menos o nome da relação com distorção. Uma relação é uma tabela, exibição ou subconsulta. Todas as junções com essa relação usam a otimização de junção de distorção.

-- 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 a dica de distorção com o nome da relação e nomes de colunas

Pode haver várias junções em uma relação e apenas algumas delas sofrerão distorção. A otimização de junção de distorção gera alguma sobrecarga; por isso, é melhor usá-la somente quando necessário. Com essa finalidade, a dica de distorção aceita nomes de colunas. Somente junções com essas colunas usam otimização de junção de distorção.

-- 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 a dica de distorção com nome da relação, nomes de colunas e valores de distorçã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 eles nunca mudem) ou ser fáceis de descobrir. Isso reduz a sobrecarga da otimização de junção de distorção. Caso contrário, o Delta Lake os detectará 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