Optimisation de la jointure Skew Skew Join optimization

L’asymétrie des données est une condition dans laquelle les données d’une table sont distribuées de manière inégale entre les partitions du cluster.Data skew is a condition in which a table’s data is unevenly distributed among partitions in the cluster. La distorsion des données peut considérablement rétrograder les performances des requêtes, en particulier celles avec des jointures.Data skew can severely downgrade performance of queries, especially those with joins. Les jointures entre les tables volumineuses requièrent des données réparties et l’inclinaison peut entraîner un déséquilibre extrême du travail dans le cluster.Joins between big tables require shuffling data and the skew can lead to an extreme imbalance of work in the cluster. Il est probable que la distorsion des données affecte une requête si une requête semble être bloquée en terminant très peu de tâches (par exemple, les 3 dernières tâches en 200).It’s likely that data skew is affecting a query if a query appears to be stuck finishing very few tasks (for example, the last 3 tasks out of 200). Pour vérifier :To verify:

  1. Cliquez sur l’étape qui est bloquée et assurez-vous qu’elle fait une jointure.Click the stage that is stuck and verify that it is doing a join.
  2. Une fois la requête terminée, recherchez l’étape qui effectue une jointure et vérifiez la distribution de la durée des tâches.After the query finishes, find the stage that does a join and check the task duration distribution.
  3. Triez les tâches en diminuant la durée et vérifiez les premières tâches.Sort the tasks by decreasing duration and check the first few tasks. Si l’exécution d’une tâche a pris plus de temps que les autres tâches, il y a un décalage.If one task took much longer to complete than the other tasks, there is skew.

Pour améliorer la distorsion, Delta Lake sur Azure Databricks SQL accepte les indicateurs skew dans les requêtes.To ameliorate skew, Delta Lake on Azure Databricks SQL accepts skew hints in queries. Avec les informations de ces indicateurs, Spark peut construire un meilleur plan de requête, qui n’est pas affecté par l’asymétrie des données.With the information from these hints, Spark can construct a better query plan, one that does not suffer from data skew.

Nom de la relation uniquementOnly relation name

Un indicateur skew doit contenir au moins le nom de la relation avec skew.A skew hint must contain at least the name of the relation with skew. Une relation est une table, une vue ou une sous-requête.A relation is a table, view, or a subquery. Toutes les jointures associées à cette relation utilisent ensuite l’optimisation de jointure skew.All joins with this relation then use skew join optimization.

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

Relation et colonnesRelation and columns

Il peut y avoir plusieurs jointures sur une relation, et seules certaines d’entre elles seront affectées par l’obliquité.There might be multiple joins on a relation and only some of them will suffer from skew. L’optimisation de la jointure skew a une certaine surcharge. il est donc préférable de l’utiliser uniquement lorsque cela est nécessaire.Skew join optimization has some overhead so it is better to use it only when needed. À cet effet, l' indicateur skew accepte les noms de colonne.For this purpose, the skew hint accepts column names. Seules les jointures avec ces colonnes utilisent l’optimisation de jointure skew.Only joins with these columns use skew join optimization.

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

Valeurs de relation, de colonnes et d’inclinaisonRelation, columns, and skew values

Vous pouvez également spécifier des valeurs d’inclinaison dans l’indicateur.You can also specify skew values in the hint. En fonction de la requête et des données, les valeurs d’inclinaison peuvent être connues (par exemple, parce qu’elles ne changent jamais) ou peuvent être faciles à trouver. Cela réduit la charge de l’optimisation de jointure skew.Depending on the query and data, the skew values might be known (for example, because they never change) or might be easy to find out. Doing this reduces the overhead of skew join optimization. Sinon, Delta Lake les détecte automatiquement.Otherwise, Delta Lake detects them automatically.

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