Aller au contenu principal

Optimisation des opérations de jonction asymétriques à l'aide d'indicateurs d'asymétrie

important

Cette documentation a été retirée et pourrait ne pas être mise à jour. Les produits, services ou technologies mentionnés dans ce contenu ne sont plus pris en charge.

Les indicateurs de jointure d'asymétrie ne sont pas requis. Databricks gère l'asymétrie par default en utilisant l'exécution adaptative des requêtes (AQE). Consultez l'exécution adaptative des requêtes.

remarque

spark.sql.adaptive.skewJoin.enabled doit être True, qui est le paramètre default sur Databricks.

Qu'est-ce que l'asymétrie des données ?

Le déséquilibre des données désigne une condition où les données d'une table sont inégalement réparties entre les partitions du cluster. La distorsion des données peut gravement dégrader les performances des queries, en particulier celles avec des jointures. Les jointures entre grandes tables nécessitent le brassage des données, et le déséquilibre peut entraîner un déséquilibre extrême du travail dans le cluster. Il est probable qu'un déséquilibre de données affecte une query si une query semble bloquée à terminer très peu de tâches (par exemple, les 3 dernières tâches sur 200). Pour vérifier qu'un déséquilibre de données affecte une query :

  1. Cliquez sur l'étape qui est bloquée et vérifiez qu'elle effectue une jointure.
  2. Une fois la query terminée, recherchez l’étape qui effectue une jointure et vérifiez la répartition de la durée des tâches.
  3. Triez les tâches par durée décroissante et vérifiez les premières tâches. Si une tâche a pris beaucoup plus de temps à s'achever que les autres tâches, il y a un décalage.

Pour améliorer l'asymétrie, Delta Lake sur Databricks SQL accepte les *indicateurs d'asymétrie* dans les requêtes. Grâce aux informations d'un indicateur d'asymétrie, Databricks Runtime peut construire un meilleur plan de requête, un plan qui ne souffre pas d'asymétrie des données.

Configurer l’indice d’asymétrie avec le nom de la relation

Un indice de biais doit contenir au moins le nom de la relation avec le biais. Une relation est une table, une vue ou une sous-requête. Toutes les opérations de jonction avec cette relation utilisent alors l'optimisation des opérations de jonction de biais.

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

Configurez l'indice d'asymétrie avec le nom de la relation et les noms de colonne

Il pourrait y avoir plusieurs jonctions sur une relation et seulement certaines d'entre elles seront affectées par l'asymétrie. L'optimisation des jonctions asymétriques entraîne une certaine surcharge, il est donc préférable de l'utiliser uniquement lorsque cela est nécessaire. À cette fin, l'indicateur d'asymétrie accepte les noms de colonne. Seules les jonctions avec ces colonnes utilisent l'optimisation des jonctions asymétriques.

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

Configurez l'indice d'asymétrie avec le nom de la relation, les noms de colonne et les valeurs d'asymétrie.

Vous pouvez également spécifier des valeurs d'asymétrie dans l'indice. Selon la query et les données, les valeurs d'asymétrie peuvent être connues (par exemple, parce qu'elles ne changent jamais) ou peuvent être faciles à déterminer. Cela réduit la surcharge de l’optimisation des jointures asymétriques. Dans le cas contraire, Delta Lake les détecte automatiquement.

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