View a markdown version of this page

Plananalyse abfragen - Amazon DocumentDB

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Plananalyse abfragen

Die Analyse des Abfrageplans mithilfe von Explain Plan bietet wichtige Einblicke in die Abfrageleistung von Amazon DocumentDB. Der Abfrageplan mit executionStats zeigt wichtige Kennzahlen wie:

  • Pro Phase zurückgegebene Dokumente (nReturned)

  • Stage-specific Ausführungszeiten (AusführungTimeMillisEstimate)

  • Dauer der Planerstellung (PlanungTimeMillis)

Durch die Untersuchung der Ergebnisse des Abfrageplans können Entwickler Ausführungsmuster analysieren, die Indexauslastung bewerten und potenzielle Optimierungsmöglichkeiten in allen Phasen der Abfragepipeline identifizieren.

Um den Abfrageplan zu analysieren, können Sie den Befehl explain () in den folgenden Formaten verwenden.

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

Im Folgenden finden Sie ein Beispiel für eine Operation:

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

Die Ausgabe dieser Operation sieht in etwa wie folgt aus:

{ 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 }) }

Im Folgenden finden Sie eine detaillierte Analyse eines Amazon DocumentDB DocumentDB-Abfrageausführungsplans, in dem jede Komponente und ihre Leistungsmerkmale aufgeschlüsselt sind.

Allgemeiner Zeitplan

Die Ausführung TimeMillis stellt die Gesamtzeit dar, die für die Abfrage benötigt wurde, einschließlich der Planungszeit.

Planung TimeMillis stellt die gesamte Planungszeit dar, die für die Abfrage benötigt wurde.

Phasen der Ausführung

Es beschreibt Schritt für Schritt, wie Amazon DocumentDB eine Abfrage ausführt, und zeigt, wie Daten durch verschiedene Operationen fließen.

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

Allgemeine Phasen in einem Abfrageplan

Im Folgenden sind die häufigsten Ausführungsphasen in einem Abfrageplan aufgeführt. In jeder Phase werden Metriken für Ausführung TimeMillisEstimate (Ausführungszeit) und NReturned (Anzahl der Dokumente) zurückgegeben, mit deren Hilfe die Abfrageleistung in jeder Phase bewertet werden kann.

COLLSCAN (Sammlungsscan)

  • Scannt die gesamte Sammlung Dokument für Dokument

  • nReturned: Gibt alle passenden Dokumente in der Sammlung zurück

  • Kann ein teurer Vorgang sein, wenn kein Index verfügbar ist

IXSCAN (Indexscan)

  • Verwendet einen Index, um passende Dokumente zu finden

  • Zurückgegeben: Nur übereinstimmende Dokumente, die auf dem Index basieren

  • Effizienter Betrieb, gegenüber COLLSCAN bevorzugt

SORT

  • Sortiert Dokumente anhand bestimmter Felder

  • Wenn das Sortierattribut in der Abfrage nicht Teil eines Indexes ist, wird diese Phase explizit angezeigt

  • Zurückgegeben: Dieselbe Zahl wie bei den Eingabedokumenten

  • Memory-intensive für große Ergebnismengen. Fügen Sie zur Optimierung den Namen des Sortierfeldes einem Index hinzu

LIMIT_SKIP

  • Steuert die Anzahl der zurückgegebenen und übersprungenen Dokumente

  • Rückgegeben: Limitiert durch den LIMIT-Wert

  • Wird für Paginierung oder LIMIT-Operationen verwendet

SUBSCAN

  • Führt verschachtelte Abfrageoperationen aus

  • Zurückgegeben: Variiert je nach den Ergebnissen der Unterabfrage

  • Wird in komplexen Abfragen mit mehreren Phasen verwendet

Phasen mit hoher Ausführungsrate TimeMillisEstimate eignen sich gut für eine Optimierung.

Anmerkung

Der ExecutionStats-Parameter unterstützt derzeit keine Aktualisierungs- und Löschbefehle.

Grundlegendes zu DocsExamined in Explain Plan Execution Stats

Wenn Sie eine Abfrage mit ausführenexplain("executionStats"), bietet Amazon DocumentDB Prüfungsmetriken, anhand derer Sie nachvollziehen können, wie viele Dokumente gescannt wurden, um die Abfrageergebnisse zu erhalten. Diese Metriken sind nützlich, um ineffiziente Abfragepläne zu identifizieren und die Leistung zu optimieren.

Anmerkung

Nur in Amazon DocumentDB 8.0.0+ verfügbar.

Felder

Feld Description Level
insgesamt DocsExamined Gesamtzahl der Dokumente, die in allen Ausführungsphasen geprüft wurden. Top-level executionStats
Dokumente geprüft Anzahl der Dokumente, die in einer bestimmten Ausführungsphase geprüft wurden. Stage-level

Das docsExamined Feld erscheint in den folgenden Phasen:

Stage Description
COLLSCAN Sammlung scannen. Alle Dokumente in der Sammlung werden geprüft.
ISCAN Indexscan. Es werden nur Dokumente untersucht, die der Indexbedingung entsprechen.
FETCH Wenn der Optimierer Dokumente in einer separaten Phase von IXSCAN abruft, meldet die FETCH-Phase den Wert DocsExamined. In Indexscanplänen melden die untergeordneten IXSCAN-Stufen nicht den Wert docsExamined. In $lookup-Plänen können sowohl die FETCH-Phase als auch ihre untergeordneten Stufen den Wert DocsExamined melden.
Anmerkung

docsExaminedwird in den Stufen IXONLYSCAN nicht angezeigt, da die Abfrage vollständig aus dem Index beantwortet wird, ohne dass auf Dokumente zugegriffen wird.

In der Ausgabe von Explain Plan executionStats Dokumente anzeigen

Die folgenden Beispiele verwenden eine Sammlung mit 500.000 Dokumenten und veranschaulichen, wie sich die docsExamined Änderungen in den verschiedenen Phasen der Abfrageausführung ändern.

Erstellen Sie Beispieldaten:

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

Sammlungsscan (COLLSCAN)

Ohne Index führt Amazon DocumentDB einen vollständigen Sammlungsscan durch.

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

Ausgabe:

{ "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 } } } }

Alle 500.000 Dokumente wurden untersucht und lieferten 500 Ergebnisse. Das Erstellen eines Indexes für das Zahlenfeld verbessert dies.

Indexscan (IXSCAN)

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

Ausgabe:

{ "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 } } ] } } }

Mit dem Index wurden nur 5.000 von 500.000 Dokumenten geprüft und abgerufen, was der zurückgegebenen Zahl entsprach. Durch die Indexbedingung wurden 495.000 Dokumente herausgefiltert, die der Abfrage nicht entsprachen.

Indexscan mit Restfilter

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

Ausgabe:

{ "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 } } } }

Die Indexbedingung entsprach 5.000 von 500.000 Dokumenten, danach arr reduzierte der Restfilter das Ergebnis auf 999. Der docsExamined Wert 5.000 spiegelt alle Dokumente wider, die nach der Indexbedingung, aber vor der Anwendung des Restfilters untersucht wurden.

Mit IXSCAN abrufen

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

Ausgabe:

{ "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 } } ] } } ] } } }

Wenn der Amazon DocumentDB DocumentDB-Optimierer eine Abrufphase zum Abrufen von Dokumenten verwendet, werden in der FETCH-Phase Berichte erstellt. docsExamined Die untergeordneten IXSCAN-Stufen erstellen keine Berichte, docsExamined da sie nur Indexschlüssel scannen, ohne direkt auf Dokumente zuzugreifen.

FETCH mit aggregierter Suche

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

Ausgabe:

{ "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 } } ] } } } } ] } }

Der äußere IXSCAN untersuchte 5 Dokumente, die der Zahl < 5 entsprachen. Der innere IXSCAN untersuchte 3 Dokumente, die der Zahl < 3 entsprachen, und in der FETCH-Phase wurde ein aggregiertes Ergebnis untersucht. Die totalDocsExamined Zahl 9 ist die Summe aller Stufen (5 + 3 + 1).