Otimização de junção de inclinação usando dicas de inclinaçã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 são mais suportados.
Não são necessárias dicas de junção inclinada. O Databricks manipula a inclinação por padrão usando a execução de consulta adaptável (AQE). Consulte 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 é 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:
- 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 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