Skew Aderir otimização

O distorção dos dados é uma condição em que os dados de uma tabela são distribuídos de forma desigual entre divisórias no cluster. A distorção dos dados pode reduzir severamente o desempenho das consultas, especialmente as que têm juntas. As juntas entre as grandes tabelas requerem dados baralhadas e o enviesamento pode levar a um desequilíbrio extremo de trabalho no cluster. É provável que o distorcer de dados esteja a afetar uma consulta se uma consulta parece estar presa a terminar muito poucas tarefas (por exemplo, as últimas 3 tarefas em 200). Para verificar:

  1. Clique no estágio que está preso e verifique se está a fazer uma junção.
  2. Após o final da consulta, encontre a fase que faz uma junção e verifique a distribuição da duração da tarefa.
  3. Ordenar as tarefas diminuindo a duração e verificar as primeiras tarefas. Se uma tarefa demorou muito mais tempo a ser concluída do que as outras tarefas, há distorção.

Para melhorar a distorção, o Lago Delta em Azure Databricks SQL aceita dicas de distorção em consultas. Com a informação destas dicas, a Spark pode construir um melhor plano de consulta, que não sofra de distorção de dados.

Nome único da relação

Uma sugestão de skew deve conter, pelo menos, o nome da relação com distorção. Uma relação é uma tabela, vista ou um subquery. Todos se juntam a esta relação e depois usam a otimização de união de skew.

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

Relação e colunas

Pode haver múltiplas junções numa relação e apenas algumas delas sofrerão de distorção. A otimização de adere à skew tem alguma sobrecarga, por isso é melhor usá-la apenas quando necessário. Para este efeito, a sugestão de distorção aceita nomes de colunas. Só se junta a estas colunas que usam otimização de união de skew.

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

Relação, colunas e valores distorcidos

Também pode especificar valores de distorção na sugestão. Dependendo da consulta e dos dados, os valores distorcidos podem ser conhecidos (por exemplo, porque nunca mudam) ou podem ser fáceis de descobrir. Ao fazê-lo, reduz-se a sobrecarga da otimização de união de skew. Caso contrário, o Lago Delta 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