Pular para o conteúdo principal

Skew join otimização usando dicas de skew

important

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.

nota

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:

  1. Clique no estágio que está travado e verifique se ele está fazendo um join.
  2. 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.
  3. 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.

SQL
-- 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.

SQL
-- 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.

SQL
-- 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