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).