View a markdown version of this page

Analyse du plan de requêtes - Amazon DocumentDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Analyse du plan de requêtes

L'analyse du plan de requête via le plan d'explication fournit des informations essentielles sur les performances des requêtes Amazon DocumentDB. Le plan de requête avec ExecutionStats révèle des indicateurs clés, notamment :

  • Documents renvoyés par étape (nReturned)

  • Stage-specific délais d'exécution (exécutionTimeMillisEstimate)

  • Durée de génération du plan (planificationTimeMillis)

En examinant le résultat du plan de requête, les développeurs peuvent analyser les modèles d'exécution, évaluer l'utilisation des index et identifier les opportunités d'optimisation potentielles au cours des étapes du pipeline de requêtes.

Pour analyser le plan de requête, vous pouvez utiliser la commande explain () dans les formats suivants.

db.runCommand({explain: {query document}, verbosity: "executionStats"}) db.collection.find().explain("executionStats");

Voici un exemple d'opération :

db.collection.find({ companyname: { '$eq': 'ANYCOMPANY' }, isDeleted: { '$eq': false } }).sort({"createdAt":1}).limit(2).explain("executionStats");

Le résultat de cette opération ressemble à ce qui suit :

{ queryPlanner: { plannerVersion: 2, namespace: 'limit_test.test', winningPlan: { stage: 'LIMIT_SKIP', inputStage: { stage: 'SORT', sortPattern: { createdAt: 1 }, inputStage: { stage: 'IXSCAN', indexName: 'companyname_1_createdAt_1_isDeleted_1', direction: 'forward', indexCond: { '$and': [ { companyname: { '$eq': 'ANYCOMPANY' } }, { isDeleted: { '$eq': false } } ] } } } } }, indexFilterSet: false, indexFilterApplied: false, executionStats: { executionSuccess: true, executionTimeMillis: '4.186', planningTimeMillis: '3.909', executionStages: { stage: 'LIMIT_SKIP', nReturned: '2', executionTimeMillisEstimate: '0.199', inputStage: { stage: 'SORT', nReturned: '2', executionTimeMillisEstimate: '0.197', sortPattern: { createdAt: 1 }, inputStage: { stage: 'IXSCAN', nReturned: '34', executionTimeMillisEstimate: '0.151', indexName: 'companyname_1_createdAt_1_isDeleted_1', direction: 'forward', indexCond: { '$and': [ { companyname: { '$eq': 'ANYCOMPANY' } }, { isDeleted: { '$eq': false } } ] } } } } }, serverInfo: { host: 'demo-cluster', port: 27017, version: '5.0.0' }, ok: 1, operationTime: Timestamp({ t: 1759915116, i: 1 }) }

Vous trouverez ci-dessous une analyse détaillée d'un plan d'exécution de requêtes Amazon DocumentDB, détaillant chaque composant et ses caractéristiques de performance.

Chronométrage global

l'exécution TimeMillis représente le temps total nécessaire à la requête, y compris le temps de planification.

la planification TimeMillis représente le temps de planification total nécessaire à la requête.

Étapes d'exécution

Il décrit le processus étape par étape qu'Amazon DocumentDB utilise pour exécuter une requête, en montrant comment les données circulent au cours des différentes opérations.

"executionStages": { "stage": "[STAGE_NAME]", "nReturned": "[NUMBER_OF_DOCS]", "executionTimeMillisEstimate": "[TIME]", "inputStage": { // Nested stages } }

Étapes courantes d'un plan de requête

Vous trouverez ci-dessous les étapes d'exécution courantes d'un plan de requête. Chaque étape renvoie des métriques d'exécution TimeMillisEstimate (temps d'exécution) et NReturned (nombre de documents) pour aider à évaluer les performances des requêtes à chaque étape.

COLLSCAN (numérisation des collections)

  • Numérise l'intégralité de la collection document par document

  • nReturned : renvoie tous les documents correspondants de la collection

  • Cela peut être une opération coûteuse, vu lorsqu'aucun indice n'est disponible

IXSCAN (analyse d'index)

  • Utilise un index pour trouver les documents correspondants

  • nReturned : seuls les documents correspondants sont basés sur l'index

  • Fonctionnement efficace, préféré à COLLSCAN

SORT

  • Trie les documents en fonction de champs spécifiés

  • Si l'attribut de tri de la requête ne fait pas partie d'un index, cette étape apparaîtra explicitement

  • nRetourné : même numéro que les documents d'entrée

  • Memory-intensive pour de grands ensembles de résultats. Pour optimiser, ajoutez le nom du champ de tri à un index

LIMIT_SKIP

  • Contrôle le nombre de documents renvoyés et ignorés

  • nRetourné : limité par la valeur LIMITE

  • Utilisé pour les opérations de pagination ou de LIMIT

SOUS-SCAN

  • Effectue des opérations de requête imbriquées

  • nReturned : varie en fonction des résultats de la sous-requête

  • Utilisé dans les requêtes complexes comportant plusieurs étapes

Les étapes à haut niveau d'exécution TimeMillisEstimate sont de bons candidats à l'optimisation.

Note

Le paramètre ExecutionStats ne prend actuellement pas en charge les commandes de mise à jour et de suppression.

Comprendre les documents examinés dans Explain Plan Execution Stats

Lorsque vous exécutez une requête avecexplain("executionStats"), Amazon DocumentDB fournit des métriques d'examen qui vous aident à comprendre combien de documents ont été scannés pour produire les résultats de la requête. Ces mesures sont utiles pour identifier les plans de requêtes inefficaces et optimiser les performances.

Note

Disponible uniquement dans Amazon DocumentDB 8.0.0+.

Champs

Champ Description Niveau
total DocsExamined Nombre total de documents examinés à toutes les étapes d'exécution. Top-level ExecutionStats
Docs examinés Nombre de documents examinés par une étape d'exécution spécifique. Stage-level

Le docsExamined champ apparaît aux étapes suivantes :

Étape Description
COLLISCAN Numérisation de la collection. Tous les documents de la collection sont examinés.
IXSCAN Scan de l'index. Seuls les documents correspondant à la condition d'index sont examinés.
FETCH Lorsque l'optimiseur extrait des documents dans une étape distincte d'IXSCAN, l'étape FETCH indique DocsExamined. Dans les plans d'analyse d'index, les étapes IXSCAN secondaires ne signalent pas DocsExamined. Dans les plans $lookup, l'étape FETCH et ses étapes secondaires peuvent signaler DocsExamined.
Note

docsExaminedn'apparaît pas sur les stages IXONLYSCAN car la requête est entièrement satisfaite à partir de l'index sans accès aux documents.

Afficher les documents examinés dans la sortie Explain Plan ExecutionStats

Les exemples suivants utilisent une collection de 500 000 documents et montrent comment cela docsExamined change au cours des différentes étapes d'exécution des requêtes.

Créez des exemples de données :

for (let i = 0; i < 500000; i++) { db.coll.insertOne({ number: i, arr: [i, [i+1]], value: "test", bool: i % 2 === 0 }); }

Numérisation de la collection (COLLSCAN)

Sans index, Amazon DocumentDB effectue une analyse complète de la collection.

db.coll.find({ "number": { "$lt": 500 } }).explain("executionStats").executionStats

Sortie :

{ "executionSuccess" : true, "nReturned" : "500", "executionTimeMillis" : "282.055", "planningTimeMillis" : "0.085", "totalDocsExamined" : "500000", "executionStages" : { "stage" : "COLLSCAN", "nReturned" : "500", "executionTimeMillisEstimate" : "281.915", "docsExamined" : "500000", "filter" : { "number" : { "$lt" : 500 } } } }

Les 500 000 documents ont tous été examinés pour obtenir 500 résultats. La création d'un index sur le champ numérique améliore cela.

Scan d'index (IXSCAN)

db.coll.createIndex({ number: 1 }); db.coll.find({ "number": { "$lt": 5000 } }).explain("executionStats").executionStats

Sortie :

{ "executionSuccess" : true, "nReturned" : "5000", "executionTimeMillis" : "3.047", "planningTimeMillis" : "0.296", "totalDocsExamined" : "5000", "executionStages" : { "stage" : "IXSCAN", "nReturned" : "5000", "executionTimeMillisEstimate" : "2.576", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5000", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5000 } } ] } } }

Grâce à cet index, seuls 5 000 documents sur 500 000 ont été examinés et récupérés, ce qui correspond au nombre de documents renvoyés. La condition d'index a filtré 495 000 documents qui ne correspondaient pas à la requête.

Scan d'index avec filtre résiduel

db.coll.find({ "number": { "$lt": 5000 }, "arr": { "$gt": 4000 } }).explain("executionStats").executionStats

Sortie :

{ "executionSuccess" : true, "nReturned" : "999", "executionTimeMillis" : "15.367", "planningTimeMillis" : "0.115", "totalDocsExamined" : "5000", "executionStages" : { "stage" : "IXSCAN", "nReturned" : "999", "executionTimeMillisEstimate" : "15.170", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5000", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5000 } } ] }, "filter" : { "arr" : { "$gt" : 4000 } } } }

La condition d'index correspondait à 5 000 documents sur 500 000, puis le filtre résiduel activé arr a réduit le résultat à 999. La docsExamined valeur de 5 000 reflète tous les documents examinés après la condition d'indice mais avant l'application du filtre résiduel.

Récupérez avec IXSCAN

db.coll.find({ "$or": [{ "number": { "$lt": 100000 } }, { "number": { "$gt": 400000 } }] }).explain("executionStats").executionStats

Sortie :

{ "executionSuccess" : true, "nReturned" : "199999", "executionTimeMillis" : "899.801", "planningTimeMillis" : "0.183", "totalDocsExamined" : "199999", "executionStages" : { "stage" : "FETCH", "nReturned" : "199999", "executionTimeMillisEstimate" : "894.141", "docsExamined" : "199999", "inputStage" : { "stage" : "IXOR", "nReturned" : "0", "executionTimeMillisEstimate" : "874.897", "inputStages" : [ { "stage" : "IXSCAN", "nReturned" : "100000", "executionTimeMillisEstimate" : "462.208", "indexName" : "number_1", "indexCond" : { "$and" : [ { "number" : { "$lt" : 100000 } } ] } }, { "stage" : "IXSCAN", "nReturned" : "99999", "executionTimeMillisEstimate" : "412.684", "indexName" : "number_1", "indexCond" : { "$and" : [ { "number" : { "$gt" : 400000 } } ] } } ] } } }

Lorsque l'optimiseur Amazon DocumentDB utilise une phase de récupération pour récupérer des documents, l'étape FETCH génère des rapports. docsExamined Les étapes IXSCAN secondaires ne produisent aucun rapport docsExamined car elles ne font que scanner les clés d'index sans accéder directement aux documents.

FETCH avec recherche agrégée

db.coll.explain("executionStats").aggregate([ { $match: { "number": { "$lt": 5 } } }, { $lookup: { from: "coll", pipeline: [{ $match: { "number": { "$lt": 3 } } }], as: "sub" } } ]).executionStats

Sortie :

{ "executionSuccess" : true, "nReturned" : "5", "executionTimeMillis" : "0.525", "planningTimeMillis" : "0.327", "totalDocsExamined" : "9", "executionStages" : { "stage" : "NESTED_LOOP_LOOKUP", "nReturned" : "5", "executionTimeMillisEstimate" : "0.163", "inputStages" : [ { "stage" : "IXSCAN", "nReturned" : "5", "executionTimeMillisEstimate" : "0.039", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5 } } ] } }, { "stage" : "FETCH", "nReturned" : "1", "executionTimeMillisEstimate" : "0.009", "docsExamined" : "1", "inputStage" : { "stage" : "AGGREGATE", "nReturned" : "1", "executionTimeMillisEstimate" : "0.044", "inputStage" : { "stage" : "IXSCAN", "nReturned" : "3", "executionTimeMillisEstimate" : "0.013", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "3", "indexCond" : { "$and" : [ { "number" : { "$lt" : 3 } } ] } } } } ] } }

L'IXSCAN externe a examiné 5 documents dont le numéro était inférieur à 5. L'IXSCAN interne a examiné 3 documents correspondant à un nombre inférieur à 3, et l'étape FETCH a examiné 1 résultat agrégé. Le totalDocsExamined 9 est la somme de toutes les étapes (5 + 3 + 1).