Tous les produits
Search
Centre de documentation

Lindorm:Overview of query plans

Dernière mise à jour :Aug 11, 2026

Utilisez la syntaxe EXPLAIN pour inspecter le mode d'exécution d'une requête par Lindorm SQL. Les plans de requête révèlent la méthode d'analyse des données, la sélection des index, les opérations relationnelles et le comportement de délégation (push-down). Ils vous offrent une visibilité claire sur les actions du moteur de requête, ce qui facilite le diagnostic des problèmes et l'optimisation des performances.

Les plans de requête sont pris en charge pour LindormTable et LindormTSDB.

Fonctionnement

Lorsque Lindorm SQL reçoit une requête, il analyse la syntaxe SQL pour générer un arbre syntaxique abstrait, le réécrit sous forme de plan logique, puis applique une optimisation basée sur des règles ou sur les coûts afin de produire un plan physique. Ce plan physique est effectivement exécuté : il spécifie quels opérateurs s'exécutent dans Lindorm SQL et quelles opérations sont déléguées au moteur de stockage.

La commande EXPLAIN permet d'inspecter le plan à trois niveaux de profondeur :

Niveau Cas d'utilisation
Plan physique (par défaut) Diagnostiquer les problèmes de performance : vérifiez l'index sélectionné, la plage d'analyse et l'ordre des opérations
Plan logique Déboguer les problèmes sémantiques : inspectez la manière dont Lindorm SQL réécrit votre requête avant l'optimisation
Plan de type Vérifier les types de colonnes : confirmez le schéma de sortie sans exécuter un plan complet

Niveaux de profondeur des plans de requête

Plan logique

Le plan logique affiche la structure de la requête après réécriture, mais avant optimisation. Lindorm SQL le génère à partir de l'arbre syntaxique abstrait et peut appliquer des réécritures telles que :

  • Le remplacement d'une expression constante par sa valeur calculée

  • Le remplacement de AVG par des expressions équivalentes utilisant SUM et COUNT

Utilisez EXPLAIN WITHOUT IMPLEMENTATION FOR pour afficher le plan logique :

EXPLAIN WITHOUT IMPLEMENTATION FOR
  SELECT LOCATE('9378', p1) AS lp, COUNT(c1)
  FROM (SELECT * FROM test WHERE p1 LIKE '3_%')
  GROUP BY lp
  ORDER BY lp;

Résultat :

********************* 1. row *********************
PLAN: LogicalSort(sort0=[$0], dir0=[ASC])
  LogicalAggregate(group=[{0}], EXPR$1=[COUNT($1)])
    LogicalProject(lp=[LOCATE('9378', $0)], c1=[$1])
      LogicalFilter(condition=[LIKE($0, '3_%')])
        LindormTableScan(table=[[db, test]])

Pour connaître la syntaxe complète de EXPLAIN, consultez la rubrique EXPLAIN.

Plan physique

Le plan physique représente la version optimisée et exécutable de la requête. L'optimiseur sélectionne le meilleur mode d'exécution selon des politiques basées sur des règles ou sur les coûts. Il s'agit de la sortie par défaut de EXPLAIN et il affiche le chemin d'exécution complet : les opérateurs exécutés dans Lindorm SQL, les opérations déléguées à LindormTable ou LindormTSDB, l'index choisi, la plage d'analyse et les conditions de filtre.

Utilisez EXPLAIN FOR (ou simplement EXPLAIN) pour afficher le plan physique :

EXPLAIN
  SELECT LOCATE('9378', p1) AS lp, COUNT(c1)
  FROM (SELECT * FROM test WHERE p1 LIKE '3_%')
  GROUP BY lp
  ORDER BY lp;

Résultat :

********************* 1. row *********************
PLAN: EnumerableSort(sort0=[$0], dir0=[ASC])
  EnumerableAggregate(group=[{0}], EXPR$1=[COUNT($1)])
    EnumerableCalc(expr#0..3=[{inputs}], expr#4=['9378'], expr#5=[LOCATE($t4, $t0)], lp=[$t5], c1=[$t1])
      EnumerableLindormDirectQuery(
explanation=[SELECT p1,c1,c2,c3 from test where ((p1 < 4) AND (p1 >= 3) AND (p1 LIKE 3_%)) supportEmptyResult true
Candidate tables:
    Data table: test, scores=1..0..1, need query back=false, sort type=FORWARD
Chose data table [test].
---
SELECT p1,c1,c2,c3 from test supportEmptyResult true
SingleScan on test
    ranges: [3\x00, 4\x00]
    filter: ((p1 < 4) AND (p1 >= 3) AND (p1 LIKE 3_%))
])

Plan de type

Le plan de type contient uniquement les types de colonnes de sortie pour chaque colonne du jeu de résultats. Il est généré en fonction des types de requête et s'applique à des scénarios spécifiques. C'est le niveau de profondeur le plus léger des trois ; il permet de vérifier rapidement le schéma de sortie sans inspecter l'arbre d'exécution complet.

Utilisez EXPLAIN WITH TYPE FOR pour afficher le plan de type :

EXPLAIN WITH TYPE FOR
  SELECT LOCATE('9378', p1) AS lp, COUNT(c1)
  FROM (SELECT * FROM test WHERE p1 LIKE '3_%')
  GROUP BY lp
  ORDER BY lp;

Résultat :

********************* 1. row *********************
PLAN: lp INTEGER NOT NULL,
EXPR$1 BIGINT NOT NULL

Pour connaître la syntaxe complète de EXPLAIN, consultez la rubrique EXPLAIN.

Opérateurs dans les plans de requête

Les opérateurs constituent les éléments de base d'un plan physique. Chaque opérateur représente une étape distincte dans l'exécution de la requête. Lindorm SQL inclut des opérateurs polyvalents pour le calcul ainsi qu'un ensemble d'opérateurs étendus pour la délégation et les opérations spécifiques au moteur.

Opérateurs polyvalents

Ces opérateurs gèrent les opérations de calcul exécutées dans Lindorm SQL, telles que le tri, l'agrégation, la projection et le calcul.

EnumerableLimit

Ignore et tronque le jeu de résultats en fonction des valeurs OFFSET et LIMIT. La sortie du plan indique la source des valeurs offset et fetch.

Apparition : Toute requête contenant une clause LIMIT ou OFFSET.

EnumerableSort

Trie le jeu de résultats selon la clause ORDER BY à l'aide d'un algorithme de tri basé sur une arborescence (treemap). La sortie du plan affiche la clé de tri et la direction.

Apparition : Requêtes avec ORDER BY lorsque l'ordre de tri ne peut pas être satisfait par l'ordre d'analyse au niveau du stockage. Si EnumerableSort apparaît dans votre plan, l'ajout d'un index correspondant à la colonne de tri peut éliminer cet opérateur.

EnumerableAggregate

Agrège les lignes renvoyées par les opérateurs de niveau inférieur à l'aide de fonctions d'agrégation et de colonnes de regroupement facultatives. Gère également la syntaxe DISTINCT. La sortie du plan affiche la clé de regroupement et les expressions d'agrégation.

Apparition : Requêtes avec GROUP BY, des fonctions d'agrégation (COUNT, SUM, AVG, etc.) ou DISTINCT.

EnumerableCalc

Évalue les expressions — opérations arithmétiques, fonctions scalaires (à l'exclusion des fonctions d'agrégation et de fenêtrage) — et effectue la projection et le filtrage des lignes. Il s'agit d'un opérateur de calcul polyvalent.

Apparition : Requêtes appliquant des expressions ou des filtres qui ne sont pas délégués au moteur de stockage.

Opérateurs étendus

EnumerableLindormDirectQuery

Marque la partie de la requête déléguée au moteur de stockage pour exécution. Le champ explanation décrit ce qui a été délégué et la manière dont le moteur de stockage l'a traité. Le contenu de explanation varie selon le moteur :

LindormTable

Champ Description
Candidate tables Les index candidats évalués, avec leurs scores
Chose data table L'index sélectionné pour la requête
Scan type La méthode d'analyse (par exemple, SingleScan, RangeScan)
ranges La plage de clés analysée
filter Conditions de filtre appliquées lors de l'analyse

LindormTSDB

Le champ explanation contient les paramètres de l'appel API LindormTSDB invoqué pour la requête.

Opérateurs étendus pour LindormTSDB

Ces opérateurs sont spécifiques aux requêtes LindormTSDB.

TSDBDataScanRel

Une variante de LogicalTableScan qui effectue des opérations d'analyse de métriques. La sortie du plan inclut :

  • filter — conditions de filtre appliquées à l'analyse

  • project — mappage des colonnes entre l'opérateur et la table de séries temporelles

  • hint — indicateurs transmis avec l'analyse, tels que _l_series_only

Apparition : Toute requête lisant des données depuis une table de métriques LindormTSDB.

TSDBShowTagRel

Optimise les requêtes qui récupèrent toutes les valeurs d'une colonne de tag spécifique — équivalent à la syntaxe SHOW TAG VALUES dans InfluxDB. Cet opérateur apparaît au niveau le plus bas de l'arborescence du plan et indique que l'énumération des tags est gérée directement par le moteur de stockage.

Apparition : Uniquement pour les requêtes de la forme SELECT DISTINCT <tagkey column> FROM <table>.

TSDBAggScanRel

Un opérateur combiné qui fusionne EnumerableAggregation et TSDBDataScanRel en une seule étape de délégation pour l'agrégation des données de séries temporelles.

Apparition : Requêtes qui agrègent des données de séries temporelles lorsque l'analyse et l'agrégation peuvent toutes deux être déléguées à LindormTSDB.

EnumerableDownsampleQuery

Gère les requêtes utilisant la syntaxe SAMPLE BY — une extension Lindorm SQL pour le sous-échantillonnage (downsampling) des données de séries temporelles dans LindormTSDB. Comme SAMPLE BY constitue un dialecte SQL non standard, il dispose de son propre opérateur logique (LogicalDownsampleQuery) et de son opérateur physique (EnumerableDownsampleQuery). La sortie du plan inclut :

  • project — mappage des colonnes entre l'opérateur et le plan de niveau supérieur

  • filter — conditions de filtre déléguées avec l'opération de sous-échantillonnage

  • ds_agg — la fonction de sous-échantillonnage et ses paramètres

  • aggregator — opérateurs d'agrégation délégués pour l'agrégation inter-séries temporelles

  • hint — indicateurs délégués à LindormTSDB

Apparition : Uniquement dans les requêtes utilisant la syntaxe SAMPLE BY.

Étapes suivantes

  • EXPLAIN — référence complète de la syntaxe pour toutes les variantes de EXPLAIN