Abfrageleistung mit Query Explain analysieren
Mit „Query Explain“ können Sie Firestore-Abfragen im nativen Modus an das Backend senden und erhalten im Gegenzug detaillierte Leistungsstatistiken zur Backend-Abfrageausführung. Sie funktioniert wie der Vorgang EXPLAIN [ANALYZE]
in vielen relationalen Datenbanksystemen.
Query Explain-Anfragen können mit den Firestore-Server-Clientbibliotheken gesendet werden.
Mithilfe der Ergebnisse von „Query Explain“ können Sie nachvollziehen, wie Ihre Abfragen ausgeführt werden. Sie sehen Ineffizienzen und den Ort wahrscheinlicher serverseitiger Engpässe.
Abfrageerklärung:
- Bietet Statistiken zur Phase der Abfrageplanung, damit Sie Ihre Abfrageindexe anpassen und die Effizienz steigern können.
- Mit der Analyseoption können Sie die Kosten und Leistung auf Abfragebasis nachvollziehen und schnell verschiedene Abfragemuster durchlaufen, um die Nutzung zu optimieren.
Optionen für „Abfrage erläutern“: „Standard“ und „Analysieren“
Query Explain-Vorgänge können mit der Option default oder analyze ausgeführt werden.
Bei der Standardoption wird die Abfrage von Query Explain geplant, die Ausführungsphase wird jedoch übersprungen. Dadurch werden Informationen zur Planungsphase zurückgegeben. So können Sie prüfen, ob eine Abfrage die erforderlichen Indexe hat, und nachvollziehen, welche Indexe verwendet werden. So können Sie beispielsweise überprüfen, ob für eine bestimmte Abfrage ein zusammengesetzter Index verwendet wird, anstatt viele verschiedene Indexe zu schneiden.
Mit der Option „Analysieren“ plant und führt Query Explain die Abfrage aus. Dadurch werden alle oben genannten Planner-Informationen sowie Statistiken aus der Laufzeit der Abfrageausführung zurückgegeben. Dazu gehören die Abrechnungsinformationen der Abfrage sowie Einblicke auf Systemebene in die Ausführung der Abfrage. Mit diesen Tools können Sie verschiedene Abfrage- und Indexkonfigurationen testen, um Kosten und Latenz zu optimieren.
Was kostet „Abfrage erklären“?
Wenn Sie „Query Explain“ mit der Standardoption verwenden, werden keine Index- oder Lesevorgänge ausgeführt. Unabhängig von der Komplexität der Abfrage wird ein Lesevorgang berechnet.
Wenn Sie „Query Explain“ mit der Option „analyze“ verwenden, werden Index- und Lesevorgänge ausgeführt. Die Abfrage wird Ihnen also wie gewohnt in Rechnung gestellt. Für die Analyseaktivität fallen keine zusätzlichen Kosten an, sondern nur die üblichen Kosten für die ausgeführte Abfrage.
„Query Explain“ mit der Standardoption verwenden
Sie können die Clientbibliotheken verwenden, um eine Anfrage für die Standardoption zu senden.
Anfragen werden mit IAM authentifiziert. Dabei werden dieselben Berechtigungen wie für reguläre Abfragevorgänge verwendet. Andere Authentifizierungstechniken wie Firebase Authentication werden ignoriert. Weitere Informationen finden Sie im Leitfaden zu IAM für Server-Clientbibliotheken.
Java (Admin)
Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().build();
ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
Knoten (Administrator)
const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'false' };
const explainResults = await q.explain(options);
const metrics = explainResults.metrics;
const plan = metrics.planSummary;
Das genaue Format der Antwort hängt von der Ausführungsumgebung ab. Zurückgegebene Ergebnisse können in JSON konvertiert werden. Beispiel:
{ "indexes_used": [ {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"}, {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"}, ] }
Weitere Informationen finden Sie in der Referenz zum Bericht „Query Explain“.
„Query Explain“ mit der Option „analyze“ verwenden
Sie können die Clientbibliotheken verwenden, um eine Anfrage für die Analyseoption zu senden.
Anfragen werden mit IAM authentifiziert. Dabei werden dieselben Berechtigungen wie für reguläre Abfragevorgänge verwendet. Andere Authentifizierungstechniken wie Firebase Authentication werden ignoriert. Weitere Informationen finden Sie im Leitfaden zu IAM für Server-Clientbibliotheken.
Java (Admin)
Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().setAnalyze(true).build();
ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
List<Map<String, Object>> indexesUsed = planSummary.getIndexesUsed();
ExecutionStats stats = metrics.getExecutionStats();
Knoten (Administrator)
const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'true' };
const explainResults = await q.explain(options);
const metrics = explainResults.metrics;
const plan = metrics.planSummary;
const indexesUsed = plan.indexesUsed;
const stats = metrics.executionStats;
Das folgende Beispiel zeigt das stats
-Objekt, das zusätzlich zu planInfo
zurückgegeben wird.
Das genaue Format der Antwort hängt von der Ausführungsumgebung ab. Die Beispielantwort hat das JSON-Format.
{ "resultsReturned": "5", "executionDuration": "0.100718s", "readOperations": "5", "debugStats": { "index_entries_scanned": "95000", "documents_scanned": "5" "billing_details": { "documents_billable": "5", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }
Weitere Informationen finden Sie in der Referenz zum Bericht „Query Explain“.
Ergebnisse interpretieren und Anpassungen vornehmen
Sehen wir uns ein Beispiel an, in dem wir Filme nach Genre und Produktionsland abfragen.
Zur Veranschaulichung wird die Entsprechung dieser SQL-Abfrage angenommen.
SELECT * FROM /movies WHERE category = 'Romantic' AND country = 'USA';
Wenn wir die Option „analyze“ verwenden, zeigen die zurückgegebenen Messwerte, dass die Abfrage für zwei Einzelfeldindexe ausgeführt wird: (category ASC, __name__ ASC)
und (country ASC, __name__ ASC)
. Es werden 16.500 Indexeinträge gescannt, aber nur 1.200 Dokumente zurückgegeben.
// Output query planning info { "indexes_used": [ {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"}, {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"}, ] } // Output query status { "resultsReturned": "1200", "executionDuration": "0.118882s", "readOperations": "1200", "debugStats": { "index_entries_scanned": "16500", "documents_scanned": "1200" "billing_details": { "documents_billable": "1200", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }
Um die Leistung der Abfrageausführung zu optimieren, können Sie einen vollständig abgedeckten zusammengesetzten Index (category ASC, country ASC, __name__ ASC)
erstellen.
Wenn wir die Abfrage noch einmal mit der Option „analyze“ ausführen, sehen wir, dass der neu erstellte Index für diese Abfrage ausgewählt ist und die Abfrage viel schneller und effizienter ausgeführt wird.
// Output query planning info { "indexes_used": [ {"query_scope": "Collection", "properties": "(category ASC, country ASC, __name__ ASC)"} ] } // Output query stats { "resultsReturned": "1200", "executionDuration": "0.026139s", "readOperations": "1200", "debugStats": { "index_entries_scanned": "1200", "documents_scanned": "1200" "billing_details": { "documents_billable": "1200", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }