Tous les produits
Search
Centre de documentation

PolarDB:Configurer la réorganisation des jointures pour l'optimiseur

Dernière mise à jour :Aug 27, 2026

Pour améliorer la capacité de l'In-Memory Column Index (IMCI) à gérer des requêtes complexes, l'optimiseur IMCI combine des règles de transformation de requête avec les statistiques des colonnes de table et utilise une optimisation basée sur les coûts pour générer des plans d'exécution efficaces. Cette rubrique décrit le fonctionnement de la fonctionnalité d'optimisation des requêtes IMCI, son utilisation et ses limites.

Fonctionnement

Le langage SQL est déclaratif : il spécifie le résultat à renvoyer, mais pas la méthode de calcul. Pour toute instruction SQL donnée, plusieurs plans de requête valides peuvent produire le résultat correct. Par exemple :

SELECT * FROM t0, t1, t2, t3 WHERE t0.a = t1.a AND t1.a = t2.a AND t2.a = t3.a AND t3.b = t1.b;

Pour l'instruction SQL précédente, les deux plans de requête suivants peuvent renvoyer le résultat correct.执行方式 Les plans A et B sont appelés equivalent query plans. L'optimiseur explore les plans de requête équivalents pour une instruction SQL en appliquant des transformations. Par exemple, t1 INNER JOIN t2 et t2 INNER JOIN t1 constituent une paire de plans de requête équivalents. L'optimiseur peut générer t2 INNER JOIN t1 à partir de t1 INNER JOIN t2. Ce type de transformation est appelé query transformation rule.

L'optimiseur de requête suit ce flux de travail :

  1. L'optimiseur reçoit un plan de requête initial que la base de données génère en analysant une instruction SQL.

  2. Il applique ensuite des règles de transformation de requête au plan initial pour générer des plans de requête équivalents.

  3. À l'aide de statistiques et d'un modèle de coût, l'optimiseur sélectionne le plan dont le coût d'exécution estimé est le plus faible et le transmet au moteur d'exécution en tant que plan d'exécution final.

La fonctionnalité d'optimisation des requêtes s'appuie sur des statistiques pour effectuer l'estimation de la cardinalité et le calcul des coûts afin de déterminer le meilleur plan de requête. Dans IMCI, les statistiques de table incluent les éléments suivants :

  • Un histogramme décrit la distribution des valeurs d'une colonne et sert principalement à estimer la sélectivité des plages de valeurs et des prédicats d'égalité sur une seule table.

  • Le nombre de valeurs distinctes dans une colonne sert principalement à estimer le nombre de groupes dans une clause Group By et peut également aider à estimer la sélectivité des prédicats d'égalité.

  • D'autres contraintes, telles que la présence d'un index unique ou d'une contrainte de clé étrangère sur la colonne.

L'optimiseur de requête calcule le coût de chaque opérateur d'un plan de requête en fonction de deux facteurs :

  • Le nombre total de lignes traitées par l'opérateur, qui peut être estimé à partir des statistiques.

  • La complexité algorithmique de chaque opérateur utilisé dans le plan de requête.

Le nombre total de lignes traitées par un opérateur est un paramètre de sa fonction de complexité. Le coût d'exécution total d'un plan de requête correspond à la somme des coûts de tous ses opérateurs. Pour les deux plans de requête illustrés dans la figure précédente, si nous supposons l'utilisation d'un algorithme de jointure par hachage, la formule de coût est la suivante :

Costjoin=Cardinner+Cardouter

Les coûts des deux plans d'exécution sont les suivants :

CostA==10000+1+1000+100+10000+10=21111

CostB==10000+1+100+10+1000+10=11121

Le calcul montre que le plan B présente un coût d'exécution inférieur. Par conséquent, l'optimiseur sélectionne le plan B comme plan d'exécution final.

Prérequis

Votre cluster PolarDB doit satisfaire à l'une des exigences de version suivantes :

  • PolarDB for MySQL 8.0.1 avec la révision 8.0.1.1.31 ou ultérieure.

  • PolarDB for MySQL 8.0.2 avec la révision 8.0.2.2.12 ou ultérieure.

Vous pouvez consulter le numéro de version de votre cluster pour confirmer la version de votre cluster.

Limites

Les scénarios suivants peuvent entraîner des erreurs significatives dans l'estimation de la cardinalité, ce qui peut amener l'optimiseur à choisir un plan de requête sous-optimal. Vous pouvez utiliser la syntaxe HINT pour guider l'optimiseur vers un meilleur plan de requête.

  • Une requête comportant un prédicat qui utilise un opérateur de comparaison sur différentes colonnes de la même table, tel que t1.c1>t1.c2.

  • Une requête comportant un prédicat qui utilise un opérateur dont la sélectivité ne peut pas être estimée à l'aide de statistiques, tel que t1.c1 MOD 2=1 ou t1.c2 LIKE '%ABC%'.

  • Une requête comportant un prédicat contenant une expression qui ne peut pas être calculée lors de l'optimisation, telle que t1.c1+t1.c3>100.

  • Une requête où les colonnes impliquées dans un opérateur manquent des statistiques nécessaires pour estimer la sélectivité du prédicat, telle que SELECT a, SUM(b) FROM t1 HAVING SUM(b) > 10.

  • Plusieurs prédicats sont connectés par un opérateur AND, tel que t1.c1>10 AND t1.c3<5.

  • La requête comporte trop de niveaux d'imbrication.

  • La requête joint trop de tables. Vous pouvez ajuster le nombre de jointures recherchées par l'optimiseur IMCI en modifiant le paramètre loose_imci_max_enum_join_pairs.

Paramètres

Configurez les paramètres suivants dans la console pour activer et utiliser la fonctionnalité d'optimisation des requêtes IMCI. Pour obtenir des instructions sur la définition des paramètres, consultez la rubrique Spécifier les paramètres du cluster et des nœuds.

Paramètre

Description

loose_imci_optimizer_switch

Contrôle la fonctionnalité d'optimisation des requêtes IMCI. Il se compose des indicateurs suivants :

  • use_imci_card_est : Spécifie s'il faut activer l'estimation de la cardinalité et le calcul des coûts pour IMCI. Valeurs valides :

    • OFF (Par défaut) : Désactive l'estimation de la cardinalité et le calcul des coûts pour IMCI.

    • ON : Active l'estimation de la cardinalité et le calcul des coûts pour IMCI.

  • use_imci_join_reorder : Spécifie s'il faut activer la réorganisation des jointures pour IMCI. Valeurs valides :

    • OFF (Par défaut) : Désactive la réorganisation des jointures pour IMCI.

    • ON : Active la réorganisation des jointures pour IMCI.

    Remarque

    Si les tables d'une requête manquent de statistiques ou si l'estimation de la cardinalité est désactivée, la fonctionnalité de réorganisation des jointures est inefficace, même si elle est activée.

loose_imci_auto_update_statistic

Spécifie si l'optimiseur IMCI recueille automatiquement les statistiques lorsqu'elles sont obsolètes. Valeurs valides :

  • ASYNC (Par défaut) : L'optimiseur IMCI échantillonne et recueille de manière asynchrone les statistiques obsolètes.

  • SYNC : L'optimiseur IMCI échantillonne et recueille de manière synchrone les statistiques obsolètes.

  • OFF : L'optimiseur IMCI ne recueille pas les statistiques obsolètes.

loose_imci_max_enum_join_pairs

Spécifie le nombre maximal de plans de requête équivalents que l'optimiseur IMCI recherche lorsque la réorganisation des jointures est activée.

Valeurs valides : 0 à 4294967295. Valeur par défaut : 2000.

Procédure

Pour utiliser la fonctionnalité d'optimisation IMCI, collectez d'abord les statistiques selon la stratégie choisie. Après avoir collecté les statistiques, activez la fonctionnalité, puis exécutez vos requêtes.

  1. Collectez les statistiques.

    Utilisez l'une des deux stratégies suivantes pour collecter les statistiques :

    • Exécutez périodiquement la commande ANALYZE TABLE sur les tables nécessitant une optimisation IMCI pour collecter les dernières statistiques.

    • (Recommandé) Pour les tables sur lesquelles IMCI vient d'être activé, exécutez la commande ANALYZE TABLE sur un nœud en lecture seule pour créer les statistiques initiales. Définissez ensuite le paramètre loose_imci_auto_update_statistic sur ASYNC pour mettre à jour automatiquement les statistiques.

  2. Activez la fonctionnalité d'optimisation des requêtes IMCI.

    Activez la fonctionnalité d'optimisation des requêtes IMCI en définissant le paramètre loose_imci_optimizer_switch dans la console.

  3. Exécutez vos requêtes.

Comparaison des performances

L'exemple suivant utilise TPC-H Q8, qui est une requête multi-table incluant des fonctions d'agrégation.

SELECT
  o_year,
  SUM(
    CASE
      WHEN nation = 'BRAZIL' THEN volume
      ELSE 0
    END
  ) / SUM(volume) AS mkt_share
FROM
  (
    SELECT
      EXTRACT(
        year
        FROM
          o_orderdate
      ) AS o_year,
      l_extendedprice * (1 - l_discount) AS volume,
      n2.n_name AS nation
    FROM
      lineitem,
      orders,
      part,
      supplier,
      customer,
      nation n1,
      nation n2,
      region
    WHERE
      p_partkey = l_partkey
      AND s_suppkey = l_suppkey
      AND l_orderkey = o_orderkey
      AND o_custkey = c_custkey
      AND c_nationkey = n1.n_nationkey
      AND n1.n_regionkey = r_regionkey
      AND r_name = 'AMERICA'
      AND s_nationkey = n2.n_nationkey
      AND o_orderdate BETWEEN DATE '1995-01-01'
      AND DATE '1996-12-31'
      AND p_type = 'ECONOMY ANODIZED STEEL'
  ) AS all_nations
GROUP By
  o_year
ORDER BY
  o_year;
  • Le plan de requête avec l'optimisation IMCI désactivée est le suivant :未开启列存索引优化功能 Dans ce plan, de nombreuses jointures génèrent de grands ensembles de résultats intermédiaires, ce qui augmente la quantité de données et le coût de traitement pour les opérateurs suivants, entraînant une latence de requête plus longue. Sur une machine 32 cœurs avec un jeu de données TPC-H SF100, cette requête a pris 7 017 ms pour s'achever.

  • Le plan de requête avec l'optimisation IMCI activée est le suivant :开启列存索引优化功能 L'optimiseur IMCI réorganise les jointures, réduisant la taille de sortie de la plupart des opérateurs de jointure à quelques millions de lignes. Cela réduit efficacement le coût de traitement pour les opérateurs suivants. Sur la même machine 32 cœurs avec le jeu de données TPC-H SF100, cette requête a pris 1 900 ms pour s'achever, soit une réduction de 73 % du temps de requête.