Jointure de sources de données dans des vues de calcul

Optimisation des jointures

Objective

After completing this lesson, you will be able to optimisez les jointures pour améliorer les performances de la vue de calcul.

Optimisation des jointures

Définir les cardinalités de jointure

Lorsque vous définissez une jointure, vous pouvez éventuellement définir la cardinalité pour décrire la relation entre les deux sources de données, c'est-à-dire 1..1, 1..n, n..1 et n..m.

En fonction du paramètre de cardinalité de jointure, certaines jointures peuvent être omises pour améliorer les performances d'exécution, mais une option erronée peut entraîner des résultats inattendus. Par conséquent, vous devez toujours définir une cardinalité de jointure correcte. Suivez une proposition de cardinalité le cas échéant (uniquement les tables comme sources) et assurez-vous de l'exactitude continue de l'option.

Nous vous recommandons de toujours définir des cardinalités de jointure afin que l'optimiseur puisse décider si les jointures peuvent être omises au moment de l'exécution en fonction de la requête envoyée à la vue de calcul.

Si les tables sont utilisées comme sources de données et non comme vues de calcul, vous pouvez utiliser l'option Proposer cardinalité.

Attention

L'option de cardinalité est proposée en fonction du contenu des tables jointes au moment où vous sélectionnez le bouton Proposition. L'option de cardinalité n'est pas automatiquement mise à jour à mesure que le contenu de la table change. Vous devrez peut-être revenir en arrière et modifier le paramètre de cardinalité si la relation dans les données change. En outre, n'oubliez pas que vous devez utiliser des données réalistes si vous prévoyez d'utiliser la proposition. Il n'est pas bon de proposer une cardinalité sur quelques enregistrements de test qui par la suite n'ont pas de sens sur les données actives.

Avec une définition de jointure incluant des cardinalités, et sous des conditions supplémentaires, l'instanciation de la vue de calcul peut élaguer automatiquement une source de données impliquée dans un nœud de jointure. Examinons les conditions suivantes :

Une instruction SQL avec une capture d'écran du mappage de zone qui respecte les conditions préalables à l'élagage de jointure : a. Aucun champ n'est demandé dans la table à élaguer. b. Le type de jointure est externe, référentiel ou texte. c. La cardinalité de jointure est .. 1 pour la table à surveiller ou seules les mesures avec agrégation distincte de comptage ou aucune mesure n'est demandée.

Le principe clé appliqué par l'optimiseur SQL est qu'il va élaguer une source jointe, en fonction du type de jointure et des cardinalités, uniquement si cela ne peut pas affecter l'ensemble de résultats. En d'autres termes, chaque fois que l'ensemble de résultats peut être différent selon que la jointure est exécutée ou non, la jointure est exécutée.

Attention

Notez que cet élagage de jointure "par défaut" n'est pas déclenché sur une jointure interne. Pour optimiser la durée d'exécution d'une jointure interne, vous pouvez utiliser le type de jointure Référentiel (voir ci-dessous).

Voyons comment les cardinalités et le type de jointure permettent réellement à l'optimiseur de tailler.

Trois exemples, un dans lequel l'élagage est possible, deux exemples sans élagage. Pour plus de détails, reportez-vous au texte suivant.

Dans les trois exemples, basés sur le même scénario de point de départ, aucune colonne de la table de droite n'est demandée.

  • Dans le cas d'une jointure externe gauche, la table droite R peut être ignorée car la cardinalité 1..1 indique à l'optimiseur que l'exécution de la jointure n'aura pas d'impact sur l'ensemble de résultats. En effet, pour chaque rangée en L, il y aurait au plus un match en R.

  • Dans le deuxième exemple, en utilisant une jointure gauche mais une cardinalité 1..n, c'est l'inverse. Aucun élagage ne peut avoir lieu car la jointure peut correspondre à plus d'une ligne de R avec chaque ligne de L.

  • Enfin, dans le cas d'une jointure externe droite, il n'est pas possible de élaguer la table de droite, quelle que soit la cardinalité. En effet, il n'est pas possible de savoir quelles lignes de L doivent être conservées dans l'ensemble de résultats sans exécuter la jointure.

Type de jointure référentielle

Parmi les types de jointure, l'un est appelé Référentiel. Lorsque vous utilisez une jointure référentielle, vous indiquez à l'optimiseur que toute ligne d'une source a toujours une correspondance dans l'autre source. Par exemple, le poste de vente aura toujours un en-tête. Vous indiquez également si cette propriété est vraie pour la source gauche, la source droite ou les deux ; cette opération s'effectue avec la colonne Contrainte d'intégrité.

Vous devez utiliser la jointure référentielle, le cas échéant. Une capture d'écran des propriétés de jointure affiche le type de joint Référentiel avec la contrainte d'intégrité Droite. Cela signifie que chaque entrée de la table de droite a au moins une correspondance dans la table de gauche. Les autres options sont Gauche ou Les deux. Cela permet l'élagage dans les conditions énumérées dans le texte ci-dessus.

La jointure référentielle peut être considérée comme une jointure interne prenant en charge l'optimisation. Avec la cardinalité réelle définie, elle renvoie toujours le même ensemble de résultats qu'une jointure interne et utilise la contrainte d'intégrité (en plus des autres paramètres généraux de conditions d'élagage mentionnés précédemment) pour décider si l'exécution de la jointure peut être ignorée (et une table élaguée) pour augmenter les performances.

Remarque

La différence clé avec les jointures externes ou textuelles est que la jointure référentielle se comporte comme une jointure interne, comme déjà dit. En outre, pour un paramètre de cardinalité 1..1 et une contrainte d'intégrité placée sur les deux sources (gauche et droite), elle permet l'optimisation des jointures quelle que soit la source (droite ou gauche) pour laquelle aucune colonne n'est demandée.

Recommandations générales sur les jointures

Recommandation à l'aide de jointures : gérez toujours la cardinalité des jointures. Essayez d'utiliser n:1 et 1:1 pour les jointures externes gauches ou 1:n et 1:1 pour les jointures externes droite. Essayez de réduire le nombre de champs de jointure. Évitez de joindre des colonnes calculées. Évitez les conversions de types au moment de l'exécution. Vérifiez si les colonnes de jointure dynamique et d'optimisation de jointure peuvent être utilisées. (Captures d'écran de conception incorrecte nécessitant un calcul ou une conversion de type dans une jointure.)

Les jointures sont une source potentielle d'amélioration des performances. Assurez-vous de prendre en compte toutes les recommandations lors de la définition des jointures pour vous assurer d'obtenir les meilleures performances à partir de vos vues calculées.

Optimisation de la colonne de jointure

Nous avons déjà abordé l'élagage des sources de données dans une jointure, mais vous devriez en apprendre davantage sur une autre possibilité d'optimisation. Dans la source de données restante, la colonne qui faisait partie de la jointure peut-elle également être élaguée ?

Arrière-plan - Comportement par défaut

Par défaut, la colonne sur laquelle une jointure est définie sera toujours incluse dans le résultat, que la colonne ait été demandée ou non par la requête.

Cela permet de garantir un comportement d'agrégation cohérent concernant la zone de jointure, même si la zone n'est pas demandée par la requête. Si ce comportement d'agrégation change en fonction des colonnes demandées, cela peut entraîner une modification des valeurs de mesures qui en résultent.

Option Optimiser les colonnes de jointure

Lorsque vous cochez la case Optimiser les colonnes de jointure, vous indiquez au moteur de calcul que, si un partenaire de jointure est élagué, vous ne vous attendez pas à des modifications de l'ensemble de résultats selon que la colonne jointe de la source de données interrogée est utilisée ou non pour l'agrégation. Cela dépend fortement du type d'agrégations effectuées par la vue calculée. En particulier, la fonction d'agrégat SUM n'est pas sensible au niveau de regroupement, alors que les MAX ou MIN sont sensibles.

Quand l'élagage de jointure se produit-il ?

Lorsque l'option Optimiser les colonnes de jointure est active, l'élagage des colonnes de jointure entre deux sources de données, A et B, se produit lorsque les quatre conditions suivantes sont remplies :

  • Le type de jointure est Référentiel, Externe ou Texte (en fait, la vue de calcul ne peut pas être créée si le type de jointure est Interne).

  • Seules les colonnes d'un partenaire de jointure, A, sont demandées.

  • La colonne de jointure de A n'est PAS demandée par la requête.

  • La cardinalité côté B (côté du partenaire de jointure à partir duquel aucune colonne n'est demandée) est ..1.

Attention

Comme vous le voyez, l'optimisation repose fortement sur la cardinalité. Par conséquent, vous devez vous assurer que la cardinalité est définie en fonction du modèle de données réel. Si ce n'est pas le cas, l'option Optimiser les colonnes de jointure produira des résultats instables (bien que parfois plus rapides).

Greedy Join Pruning

SAP HANA Cloud QRC 3/2022 a introduit un nouveau type d'optimisation des jointures appelé Greedy Join Pruning. Il permet à l'optimiseur SQL d'élaguer une source jointe si elle n'est pas du tout interrogée (aucune colonne demandée), quels que soient les paramètres de cardinalités et de type de jointure. Cela peut considérablement améliorer la durée d'exécution de la requête. Cependant, vous devez l'utiliser uniquement lorsque les résultats attendus ne dépendent pas de l'exécution ou non de la jointure.

Pour ce faire, vous définissez l'option Pruning gourmand d'une jointure sur Gauche, Droite ou Les deux. Gauche ou Droite font référence à la source jointe qui peut être élaguée en mode gourmand.

Remarque

Lorsque l'élagage gourmand est activé, il n'empêche pas d'autres mécanismes d'élagage de jointure. Par conséquent, même si une condition n'est pas remplie pour l'élagage de jointure gourmand (par exemple, l'élagage gourmand est Gauche mais que vous demandez des colonnes de la table de gauche de la jointure), l'élagage de jointure peut toujours se produire car les cardinalités, le type de jointure, etc., l'autorisent.

Greedy Pruning peut être défini à trois niveaux différents :

Captures d'écran des méthodes de définition de l'élagage gourmand. Première option : au niveau de la jointure, choisissez la direction d'élagage gourmande. Deuxième option : utilisez l'astuce d'exécution de la requête SQL greedy_join_pruning: <valeur>. Troisième option : pour une vue de Calcul entière, définissez un conseil d'exécution dans les propriétés de la vue sur l'onglet Avancé, puis ajoutez un conseil d'exécution, recherchez l'élagage, recherchez l'entrée Gauche greedy_join_pruning avec une valeur 7.

Pruning gourmand à différents niveaux

NiveauPrioritéComment activer l'élagage gourmand
Une jointure d'une vue calculée3Dans l'onglet Définition de jointure, dans le volet Propriétés, utilisez la liste déroulante Pruning rapide.
Toutes les jointures d'une vue calculée2Dans la sémantique, affichez l'onglet Propriétés de la vue > Avancé. Sélectionnez ensuite Ajouter notes d'exécution, recherchez élagage et sélectionnez l'option d'élagage gourmande souhaitée.
Toutes les vues de calcul utilisées dans une requête SQL1

Dans votre requête SQL, ajoutez la clause d'astuce suivante :

SELECT <...> FROM <...> ('PLACEHOLDER' = ('ce_settings', '{"greedy_join_pruning": "<value>"}')

Les valeurs sont les suivantes :

  • 1 : Désactivé
  • 7 : à gauche
  • 11 : à droite
  • 15 : Les deux

La colonne de priorité de la table précédente signifie que, par exemple, un paramètre d'élagage gourmand défini pour une vue calculée entière remplace tout paramètre d'élagage gourmand défini dans l'une de ses jointures. De même, un indice d'élagage gourmand dans une requête SQL remplace tout paramètre défini pour l'ensemble de la vue de calcul ou dans une jointure spécifique.