Otimização de junção com desvio usando sugestões de desvio
Importante
Esta documentação foi desativada e pode não ser atualizada. Os produtos, serviços ou tecnologias mencionados neste conteúdo não são mais suportados.
Não são necessárias dicas de junção inclinada. O Databricks lida com o desequilíbrio por padrão usando a execução adaptativa de consultas (AQE). Consulte Execução adaptativa de consultas.
Observação
spark.sql.adaptive.skewJoin.enabled
deve ser True
, que é a configuração padrão no Azure Databricks.
O que é a 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 reduzir gravemente o desempenho de consultas, especialmente aquelas com junções. As junções entre grandes tabelas exigem reorganização de dados e o desequilíbrio pode levar a um desbalanceamento 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á afetando uma consulta:
- Clique no estágio que está preso e verifique se ele está fazendo uma 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.
- 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, há 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 sugestão de desvio com nome da relação
Uma sugestão de desvio deve conter pelo menos o nome da relação com desvio. Uma relação é uma tabela, vista ou subconsulta. Todas as ligações com esta relação utilizam então a otimização de junção desequilibrada.
-- 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 indicação de desvio 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