Optimisation de la jointure Skew

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. La distorsion des données peut considérablement rétrograder les performances des requêtes, en particulier celles avec des jointures. 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. 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). Pour vérifier que la distorsion des données affecte une requête :

  1. Cliquez sur l’étape qui est bloquée et assurez-vous qu’elle fait une jointure.
  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.
  3. Triez les tâches en diminuant la durée et vérifiez les premières tâches. Si l’exécution d’une tâche a pris plus de temps que les autres tâches, il y a un décalage.

pour améliorer la distorsion, Delta Lake sur Azure Databricks SQL accepte les indicateurs skew dans les requêtes. Avec les informations d’un indicateur Skew, Databricks Runtime pouvez construire un meilleur plan de requête, qui ne subit pas de décalage de données.

Notes

Avec Databricks Runtime 7,3 et versions ultérieures, les indicateurs de jointure skew ne sont pas requis. L’inclinaison est automatiquement prise en compte si l’exécution de requêtes adaptatives (AQE) et spark.sql.adaptive.skewJoin.enabled sont activées. Consultez exécution de requêtes adaptatives.

Configurer l’indicateur skew avec le nom de relation

Un indicateur skew doit contenir au moins le nom de la relation avec skew. Une relation est une table, une vue ou une sous-requête. Toutes les jointures associées à cette relation utilisent ensuite l’optimisation de jointure 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

Configurer l’indicateur skew avec le nom de relation et les noms de colonnes

Il peut y avoir plusieurs jointures sur une relation, et seules certaines d’entre elles seront affectées par l’obliquité. 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. À cet effet, l’indicateur skew accepte les noms de colonne. Seules les jointures avec ces colonnes utilisent l’optimisation de jointure 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

Configurer l’indicateur skew avec le nom de relation, les noms de colonne et les valeurs d’inclinaison

Vous pouvez également spécifier des valeurs d’inclinaison dans l’indicateur. 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. Sinon, Delta Lake les détecte automatiquement.

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