Skew join otimização usando dicas de skew
Essa documentação foi descontinuada e pode não estar atualizada. O produto, serviço ou tecnologia mencionados neste conteúdo não são mais suportados.
As dicas de inclinação join não são necessárias. Databricks lida com a distorção em default usando a execução adaptativa de consultas (AQE). Consulte Execução adaptável de consultas.
spark.sql.adaptive.skewJoin.enabled
deve ser True
, que é a configuração default em 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 as partições no clustering. A distorção de dados pode reduzir seriamente o desempenho das consultas, especialmente aquelas com junção. A união entre tabelas grandes exige o embaralhamento de dados e a distorção pode levar a um desequilíbrio extremo de trabalho no clustering. É provável que a distorção de dados esteja afetando uma consulta se ela parecer estar travada, terminando muito poucas tarefas (por exemplo, as últimas 3 tarefas de um total de 200). Para verificar se a distorção de dados está afetando uma consulta:
- Clique no estágio que está travado e verifique se ele está fazendo um join.
- Após o término da consulta, encontre o estágio que faz um join e verifique a distribuição da duração da tarefa.
- Classifique a tarefa por duração decrescente e verifique as primeiras tarefas. Se uma tarefa levou muito mais tempo para ser concluída do que a outra, há uma distorção.
Para melhorar a inclinação, o Delta Lake no Databricks SQL aceita dicas de inclinação nas consultas. Com as informações de uma dica de inclinação, o site Databricks Runtime pode criar um plano de consulta melhor, que não sofra com a inclinação dos dados.
Configure a dica de inclinação com o nome da 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, view, ou uma subconsulta. Todas as uniões com essa relação usam a otimização skew join.
-- 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
Configure a dica de inclinação com nome de relação e nomes de coluna
Pode haver várias uniões em uma relação e apenas algumas delas sofrerão distorção. A otimização do Skew join tem alguma sobrecarga, portanto, é melhor usá-la somente quando necessário. Para isso, a dica de distorção aceita nomes de colunas. Somente as uniões com essas colunas usam a otimização skew join.
-- 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
Configure a dica de inclinação com nome de relação, nomes de coluna e valores de inclinação
Você também pode especificar valores de inclinaçã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 do skew join. Caso contrário, o Delta Lake os detecta 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