Tous les produits
Search
Centre de documentation

MaxCompute:SKEWJOIN HINT

Dernière mise à jour :Aug 10, 2026

Lorsqu'une opération JOIN souffre de mauvaises performances en raison de valeurs de clé très fréquentes (hot keys), vous pouvez améliorer son efficacité en isolant ces clés. Le SKEWJOIN HINT divise les données en deux parties : l'une pour les hot keys et l'autre pour le reste des données. Il traite chaque partie séparément, puis fusionne les résultats. Cette astuce peut détecter automatiquement les hot keys ou vous permettre de les spécifier manuellement afin d'accélérer la jointure.

Utilisation

Pour utiliser cette fonctionnalité, ajoutez le SKEWJOIN HINT au format /*+ skewJoin(<table_name>[(<column1_name>[,<column2_name>,...])][((<value11>,<value12>)[,(<value21>,<value22>)...])]*/ dans votre instruction select. Dans cette astuce, table_name désigne la table présentant un skew, column_name indique la colonne concernée par le skew, et value spécifie la valeur de clé générant le skew.

-- Method 1: Specify the table name (note that you must hint the table alias).
select /*+ skewjoin(a) */ * from T0 a join T1 b on a.c0 = b.c0 and a.c1 = b.c1;
-- Method 2: Specify the table and the columns that you suspect are skewed. For example, columns c0 and c1 in table 'a' are skewed.
select /*+ skewjoin(a(c0, c1)) */ * from T0 a join T1 b on a.c0 = b.c0 and a.c1 = b.c1 and a.c2 = b.c2;
-- Method 3: Specify the table, columns, and the exact skewed key values. If a value is a STRING type, enclose it in double quotation marks. For example, the values in (a.c0=1 and a.c1="2") and (a.c0=3 and a.c1="4") cause data skew.
select /*+ skewjoin(a(c0, c1)((1, "2"), (3, "4"))) */ * from T0 a join T1 b on a.c0 = b.c0 and a.c1 = b.c1 and a.c2 = b.c2;
Remarque

La méthode 3, qui consiste à spécifier explicitement les valeurs de clé responsables du skew, est plus efficace que les méthodes 1 et 2.

Fonctionnement

Une hot key est une clé apparaissant très fréquemment. Par exemple, dans la figure suivante, la section rouge montre 10 000 lignes où a.c0=1 and a.c1=2 et 9 000 lignes où a.c0=3 and a.c1 = 4.热值key

Sans le SKEWJOIN HINT, la jointure des grandes tables T0 et T1 nécessite un MERGE JOIN. Ce processus redistribue toutes les occurrences identiques des hot keys vers un seul nœud, ce qui provoque un skew des données. Lorsque vous ajoutez le SKEWJOIN HINT, l'optimiseur exécute une opération d'agrégation pour identifier dynamiquement les 20 hot keys les plus fréquentes. Il divise ensuite la table T0 en deux jeux de données : l'un contenant les hot keys (données A) et l'autre contenant les valeurs restantes (données B). De même, il sépare la table T1 en lignes correspondant aux hot keys de T0 (données C) et en lignes restantes (données D). Ensuite, il effectue un MAP JOIN sur les données A et C. Étant donné que le jeu de données C est de petite taille, le MAP JOIN s'avère efficace. Il réalise ensuite un MERGE JOIN sur les données B et D. Enfin, il combine les résultats du MAP JOIN et du MERGE JOIN à l'aide d'une opération UNION ALL pour produire le résultat final, comme illustré dans la figure suivante.SkewJoin Hint

Notes

  • Le SKEWJOIN HINT prend en charge les types de jointure suivants :

    • INNER JOIN : vous pouvez appliquer l'astuce à l'une ou l'autre table de la jointure.

    • LEFT JOIN, SEMI JOIN et ANTI JOIN : vous ne pouvez appliquer l'astique qu'à la table de gauche.

    • RIGHT JOIN : vous ne pouvez appliquer l'astuce qu'à la table de droite.

    • FULL JOIN : ce type de jointure n'est pas pris en charge.

  • N'ajoutez l'astuce qu'aux jointures susceptibles de générer un skew des données. L'astuce déclenche une opération d'agrégation, ce qui introduit une certaine surcharge. De plus, pour une requête telle que A JOIN B, l'ajout d'un SKEWJOIN HINT à la table A impose un plan d'exécution physique semblable à MAP JOIN UNION ALL MERGE JOIN. Le sous-plan MAP JOIN se développe en un plan similaire à Top 20(A) MAP JOIN (B SEMI JOIN Top20(A)). Si la table B est volumineuse et que le résultat filtré de la table B reste important, l'opération MAP JOIN risque de provoquer une erreur de dépassement de mémoire (OOM) lors de la construction de la table de hachage.

  • Pour la jointure utilisant l'astuce, les types de données des clés de jointure des côtés gauche et droit doivent correspondre. Sinon, le SKEWJOIN HINT reste inefficace. Vous pouvez utiliser une fonction CAST dans une sous-requête pour garantir la cohérence des types de données, comme indiqué dans les exemples suivants :

    create table T0(c0 int, c1 int, c2 int, c3 int);
    create table T1(c0 string, c1 int, c2 int);
    --Method 1:
    select /*+ skewjoin(a) */ * from T0 a join T1 b on cast(a.c0 as string) = cast(b.c0 as string) and a.c1 = b.c1;
    --Method 2:
    select /*+ skewjoin(b) */ * from (select cast(a.c0 as string) as c00 from T0 a) b join T1 c on b.c00 = c.c0;
  • Après avoir ajouté le SKEWJOIN HINT, l'optimiseur exécute une opération d'agrégation pour identifier les 20 hot keys les plus fréquentes. La valeur 20 constitue la valeur par défaut. Vous pouvez modifier cette valeur par défaut en exécutant la commande set odps.optimizer.skew.join.topk.num = xx;.

  • Vous ne pouvez appliquer le SKEWJOIN HINT qu'à une seule table d'une jointure.

  • La jointure utilisant l'astuce doit être une équijointure incluant une condition left key = right key. Les opérations CARTESIAN JOIN ne sont pas prises en charge.

  • Vous pouvez combiner le SKEWJOIN HINT avec d'autres astuces, comme indiqué dans l'exemple suivant. Toutefois, vous ne pouvez pas ajouter de SKEWJOIN HINT à une jointure qui inclut déjà une astuce MAP JOIN.

    select /*+ mapjoin(c), skewjoin(a) */ * from T0 a join T1 b on a.c0 = b.c3 join T2 c on a.c0 = c.c7;
  • Vous pouvez vérifier que le SKEWJOIN HINT est actif en recherchant le champ topk_agg dans l'onglet Json Summary de Logview.