Otimização de junção de distorção usando dicas de distorção
Importante
Esta documentação foi desativada e pode não ser atualizada. Os produtos, serviços ou tecnologias mencionados neste conteúdo não têm mais suporte.
As dicas de junção de distorção não são necessárias. O Databricks manipula a distorção por padrão usando a AQE (execução de consulta adaptável). Confira Execução de consulta adaptável.
Nota
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 forma desigual entre partições no cluster. A distorção de dados pode prejudicar significativamente o 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. É possível que a distorção de dados esteja afetando uma consulta se ela parecer estar travada, finalizando apenas algumas tarefas (por exemplo, as últimas 3 de 200 tarefas). Para verificar se a distorção de dados está afetando uma consulta:
- Clique na fase travada e verifique se ela está fazendo alguma junção.
- 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.
- Classifique as tarefas diminuindo a duração e verifique as primeiras tarefas. Se uma tarefa demorou muito mais tempo para ser concluída do que as outras tarefas, 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, sem o impacto da 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 com distorção tem um certo custo, portanto, é 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 o nome da relação, os nomes de colunas e os 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 nunca mudam) ou podem ser fáceis de descobrir. Fazer 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