Référence de l'exécution des requêtes

Cette page explique le résultat d'une requête exécutée avec Query Explain. Pour savoir comment exécuter une requête avec Query Explain, consultez Analyser l'exécution des requêtes avec Query Explain.

Concepts courants

Les concepts et termes courants suivants sont utilisés dans l'arborescence d'exécution.

Lignes et enregistrements

Les termes ligne et enregistrement sont utilisés de manière générique pour désigner un document ou une entrée d'index.

Variables

Les variables internes suivantes peuvent apparaître dans les nœuds d'exécution :

  • __key__ : la clé est un identifiant interne pour un document. Il s'agit d'un identifiant absolu et unique avec le projet, la base de données et le chemin d'accès complet du document.
  • __id__ : l'ID est un identifiant unique pour un document au sein de sa collection. Il est unique au sein d'une même collection.
  • __$0__…__$N__ : il s'agit de variables spécifiques au contexte qui sont créées ou référencées dans l'arborescence d'exécution. Ces variables sont généralement utilisées pour faire référence au contenu d'un document ou à la valeur d'une expression évaluée lors de l'exécution d'une requête.

Prenons l'exemple d'un nœud d'extension utilisé pour extraire __id__ du document __key__ :

Extend
    |  expressions: [_id(__key__) AS __id__]
    |  records returned: 1

Contraintes et plages

Certains nœuds d'analyse utilisent les attributs constraints et ranges pour décrire la plage de valeurs analysées. Ces attributs utilisent un format d'arborescence de plage qui contient une liste de valeurs. Ces valeurs correspondent à la liste ordonnée des clés qui figurent dans la définition de l'index. Par exemple, la première plage qui apparaît dans l'arborescence, ici (1..5], correspond aux contraintes sur la première clé, ici a, dans la liste ordonnée des clés :

| index: type=CollectionGroupIndex, id=CICAgOjXh#EK, keys=[a ASC, b ASC, __key__ ASC]
| constraints: /
               |----(1..5]
                    |----[1L]

Chaque niveau d'indentation indique la contrainte qui s'applique à la clé suivante de la liste. Les crochets représentent une plage inclusive, tandis que les parenthèses représentent une plage exclusive. Dans ce cas, la contrainte se traduit par 1 < "a" <= 5 et "b" = 1.

Dans l'exemple suivant avec plusieurs branches pour a, la contrainte correspond à 1 < a <= 5 OR a = 10 :

| constraints: /
               |----(1L, 5L]
               |----[10L]

Variables clés

Dans certains nœuds d'analyse (comme SequentialScan), il existe à la fois une liste de clés dans l'attribut index et un attribut keys distinct dans le nœud Scan. L'attribut keys du nœud Scan indique le nom de variable de chaque clé dans la définition de l'index, dans l'ordre. Les variables peuvent être utilisées pour référencer les valeurs d'exécution du champ analysé plus haut dans l'arborescence d'exécution.

Dans l'exemple suivant, la valeur du champ user pour le document actuel est mappée à la variable __$6__ et la valeur de date_placed à __$7__.

index: type=CollectionGroupIndex, id=CICAgOjXh4EK, keys=[user ASC, date_placed ASC, __path__ ASC]
keys: [__$6__ ASC, __$7__ ASC, __path__ ASC]

Nœuds d'exécution

Un arbre d'exécution de requête peut contenir les nœuds suivants.

SeekingScan

Représente une analyse dynamique où les lignes renvoyées peuvent ne pas se trouver dans une seule plage séquentielle de l'index, et où plusieurs analyses distinctes doivent être effectuées pour répondre à la requête.

Par exemple, une requête où a existe et où b est égal à 1 fonctionnant sur un index de ["a" ASC, "b" ASC] devrait analyser et renvoyer une plage distincte, potentiellement non séquentielle, pour chaque valeur distincte de a. Cette méthode est plus efficace qu'un TableScan complet, mais moins efficace qu'un seul SequentialScan sur un index composite de ["b" ASC, "a" ASC].

• SeekingScan
| constraints: /
               |----(-∞..+∞)
                    |----[1L]
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, quantity ASC, __key__ ASC]
| keys: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| properties: Selection { user }
| records returned: 1
| records scanned: 1

SequentialScan

Représente l'analyse d'une plage statique et séquentielle de lignes dans le stockage, qui peut être effectuée en une seule opération de lecture.

key ordering length désigne le nombre de clés qui doivent être conservées et renvoyées dans l'ordre d'origine. Pour un schéma de [k1, k2, k3], une longueur d'ordre de clé de 0 signifie que l'analyse peut renvoyer les résultats dans n'importe quel ordre, 1 signifie que l'ordre est celui de k1, mais que les lignes ayant la même valeur k1 peuvent être dans n'importe quel ordre, et 3 renvoie les documents dans un ordre trié exact.

• SequentialScan
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| key ordering length: 3
| keys: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| limit: 10
| properties: Selection { a }
| ranges: /
| records returned: 1
| records scanned: 1

UniqueScan

Représente un scan d'une plage statique et séquentielle de lignes dans le stockage avec déduplication en mémoire des lignes.

• UniqueScan
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| keys: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| properties: Selection { a }
| ranges: /
          |----(-∞..+∞)
| records returned: 1
| records scanned: 1

TableAccess

Effectue une jointure arrière de l'identifiant de la ligne fournie avec le contenu réel de la ligne à partir du stockage principal. TableAccess est obligatoire si un nœud parent (ou le résultat final de la requête) nécessite un sous-ensemble de champs des documents.

• TableAccess
|  order: PRESERVE_INPUT_ORDER
|  peak memory usage: 4.00 KiB (4,096 B)
|  properties: *
|  records returned: 1

TableScan

Analyse complète et non ordonnée d'une collection. Utilisé lorsqu'une requête est exécutée sans index associé.

L'ordre peut être STABLE ou UNDEFINED, STABLE désignant un ordre déterministe.

• TableScan
|  order: STABLE
|  properties: *
|  records returned: 1
|  records scanned: 1
|  source: (default)#/**/collection

HashAggregate

Implémentation basée sur le hachage des opérations d'agrégation. Nécessite de matérialiser l'intégralité du groupe en mémoire avant de renvoyer le résultat et ne doit pas dépasser la limite de mémoire des requêtes.

• HashAggregate
|  aggregations: [sum(__$0__) AS total]
|  groups: [a]
|  peak memory usage: 4.00 KiB (4,096 B)
|  records returned: 0

StreamAggregate

Nœud agrégé spécialisé qui ne conserve l'état que d'un seul groupe à la fois, ce qui réduit l'utilisation maximale de la mémoire. Utilisé lorsque le nœud enfant sous-jacent renvoie les groupes de manière séquentielle. Par exemple, lorsque vous regroupez des valeurs distinctes d'un champ tout en utilisant un index sur ce champ.

• StreamAggregate
|  keys: [foo ASC, bar ASC]
|  properties: Selection { baz }
|  aggregations: [$sum(foo) AS baz]

MajorSort

Effectue une opération de tri sur un ensemble fixe de propriétés. Matérialise tous les enregistrements en mémoire à la fois et renvoie les valeurs triées dans l'ordre. La taille de l'ensemble de tri est limitée par la limite de mémoire de la requête.

Lorsqu'une limite ultérieure est fournie, un algorithme de tri top-k est utilisé pour réduire l'utilisation de la mémoire. Il permet de trier un ensemble de données arbitrairement grand, à condition que la mémoire utilisée pour stocker les k éléments considérés ne dépasse pas la limite.

• MajorSort
|  fields: [a ASC, b DESC]
|  limit: 10
|  peak memory usage: 4.00 KiB (4,096 B)
|  records returned: 1

Concat

Concatène les résultats de plusieurs nœuds enfants et renvoie le résultat au nœud parent. Ce nœud ne déduplique pas les résultats qui apparaissent dans plusieurs enfants, et l'ordre des résultats renvoyés est non déterministe.

• Concat
├── • TableAccess
...
├── • TableAccess

Limiter

Projette un ensemble de propriétés à transmettre à son nœud parent. Réduit l'utilisation de la mémoire en empêchant la propagation des champs inutilisés dès qu'ils ne sont plus pertinents pour le reste de la requête.

• Restrict
|  expressions: [foo AS foo, bar AS bar]
|  records returned: 0

Prolonger

Ajoute un ensemble de champs à chaque ligne de l'ensemble de résultats. Utilisé lors de l'ajout de champs à un document et comme nœud intermédiaire pour prendre en charge des opérations plus complexes.

• Extend
|  expressions: ["bar" AS foo]
|  records returned: 1

Filtre

Renvoie sélectivement les lignes si et seulement si elles correspondent à l'expression fournie.

• Filter
|  expression: $eq(foo, "bar")
|  records returned: 1

Valeurs

Produit une séquence de valeurs littérales sur lesquelles travailler. Utilisé principalement lorsqu'une liste de documents est fournie comme entrée d'une requête.

• Values
| expression: [{__key__=/col/1}, {__key__=/col/2}]

ReplaceWith

Remplace les champs des lignes produites par le nœud enfant par les champs de l'expression map fournie.

• ReplaceWith
|  map: map("full_name", str_concat(first_name, " ", last_name)), current_context())
|  records returned: 1

Désimbriquer

Annule l'imbrication de la valeur générée par le nœud enfant.

• Unnest
|  expression: foo AS unnested_foo

Limite

Limite le nombre de lignes renvoyées au nœud parent.

• Limit
|  limit: 10
|  records returned: 1

Décalage (offset)

Ignore un nombre défini de lignes produites par le nœud enfant.

• Offset
|  offset: 10
|  records returned: 1

Drop

Supprime un ensemble de champs spécifié des résultats générés par le nœud enfant.

• Drop
|  fields to drop: [__key__]
|  records returned: 1