Analyser l'exécution des requêtes avec l'explication des requêtes

Cette page explique comment récupérer des informations sur l'exécution d'une requête lorsque vous l'exécutez.

Utiliser l'onglet "Explication de la requête"

Vous pouvez utiliser l'onglet "Explication de la requête" pour comprendre comment vos requêtes sont exécutées. Il fournit des informations que vous pouvez utiliser pour optimiser vos requêtes.

Vous pouvez utiliser l'onglet "Explication de la requête" via la console Google Cloud ou la commande explain.

Console

Exécutez une requête dans l'éditeur de requête et ouvrez l'onglet Explication :

  1. Dans la console Google Cloud, accédez à la page Bases de données.

    Accéder à la page "Bases de données"

  2. Dans la liste des bases de données, sélectionnez une base de données Cloud Firestore. La console Google Cloud ouvre l'explorateur Firestore pour cette base de données.
  3. Saisissez une requête dans l'éditeur de requête, puis cliquez sur Exécuter.
  4. Cliquez sur l'onglet Explication pour afficher le résultat de l'analyse de la requête.

    Onglet "Expliquer la requête" dans la console
API MongoDB

L'onglet "Explication de la requête" dans l'API MongoDB est compatible avec la explain commande, que vous pouvez utiliser dans des outils tels que Mongo Shell et Compass.

La commande explain est compatible avec les commandes aggregate, find, distinct et count, par exemple :

db.collection.explain('executionStats').find(...)

Vous pouvez également utiliser la méthode explain(), par exemple :

db.collection.find({QUERY}).explain('executionStats')
Limites
Tenez compte des limites et des différences suivantes :
  • L'onglet "Explication de la requête" n'est pas compatible avec les commandes qui renvoient un curseur. Par exemple, l'appel direct de la commande suivante pour invoquer l'onglet "Explication de la requête" n'est pas compatible :

    db.collection.aggregate(..., explain: true)
  • L'onglet "Explication de la requête" n'est compatible qu'avec les find, aggregate, count, et distinct commandes.

  • Les options Verbosity et Comment de l'onglet "Explication de la requête" ne sont pas compatibles avec l'API MongoDB. Le comportement correspond à l'option executionStats. Les options allPlansExecution et queryPlanner sont ignorées si elles sont fournies.

    Si aucune verbosité n'est fournie, le shell utilise la verbosité queryPlanner et filtre les statistiques d'exécution. Vous devez utiliser la verbosité executionStats ou allPlansExecution pour afficher le résultat complet.

Analyse

Le résultat de l'onglet "Explication de la requête" contient deux composants principaux : les statistiques récapitulatives et l'arborescence d'exécution. Prenons l'exemple de cette requête :

db.order.aggregate(
 [
   { "$match": { "user_id": 1234 } },
   { "$sort": { "date_placed": 1 } }
 ]
)

Statistiques récapitulatives

Le haut du résultat expliqué contient un résumé des statistiques d'exécution. Utilisez ces statistiques pour déterminer si une requête présente une latence ou un coût élevés. Il contient également des statistiques de mémoire qui vous indiquent dans quelle mesure votre requête est proche des limites de mémoire.

Billing Metrics:
read units: 1

Execution Metrics:
request peak memory usage: 4.00 KiB (4,096 B)
results returned: 1

Arborescence d'exécution

L'arborescence d'exécution décrit l'exécution de la requête sous forme de série de nœuds. Les nœuds inférieurs (nœuds feuilles) récupèrent les données de la couche de stockage qui traverse l'arborescence pour générer une réponse à la requête.

Pour en savoir plus sur chaque nœud d'exécution, consultez la documentation de référence sur l'exécution.

Pour savoir comment utiliser ces informations afin d'optimiser vos requêtes, consultez la page Optimiser l'exécution des requêtes.

Voici un exemple d'arborescence d'exécution :

• Compute
|  $out_1: map_set($record_1, "__id__", $__id___1, "__key__", $__key___1, "__row_id__", $__row_id___1, "__$0__", $__$0___2)
|  is query result: true
|
|  Execution:
|   records returned: 1
|
└── • Compute
    |  $__$0___2: UNSET
    |
    |  Execution:
    |   records returned: 1
    |
    └── • Compute
        |  $__key___1: UNSET
        |  $__row_id___1: UNSET
        |
        |  Execution:
        |   records returned: 1
        |
        └── • Compute
            |  $__id___1: _id($record_1.__key__)
            |
            |  Execution:
            |   records returned: 1
            |
            └── • MajorSort
                |  fields: [$v_5 ASC]
                |  output: [$record_1]
                |
                |  Execution:
                |   records returned: 1
                |   peak memory usage: 4.00 KiB (4,096 B)
                |
                └── • Compute
                    |  $v_5: array_get($v_4, 0L)
                    |
                    |  Execution:
                    |   records returned: 1
                    |
                    └── • Compute
                        |  $v_4: sortPaths(array($record_1.date_placed), [date_placed ASC])
                        |
                        |  Execution:
                        |   records returned: 1
                        |
                        └── • Filter
                            |  expression: $eq($user_id_1, 1,234)
                            |
                            |  Execution:
                            |   records returned: 1
                            |
                            └── • TableScan
                                   source: **/my_collection
                                   order: STABLE
                                   properties: * - { __create_time__, __update_time__ }
                                   output record: $record_1
                                   output bindings: {$user_id_1=user_id}
                                   variables: [$record_1, $user_id_1]

                                   Execution:
                                    records returned: 1
                                    records scanned: 1

Étape suivante