Abfrageleistung mithilfe von „Abfrageerläuterung“ analysieren

Mit Query Explain können Sie Cloud Firestore Abfragen an das Backend senden und erhalten im Gegenzug detaillierte Leistungsstatistiken zur Backend-Abfrageausführung. Die Funktion ähnelt dem Vorgang EXPLAIN [ANALYZE] in vielen relationalen Datenbanksystemen.

Query Explain-Anfragen können mit den Firestore-Server-Clientbibliotheken gesendet werden.

Die Ergebnisse von Query Explain helfen Ihnen, die Ausführung Ihrer Abfragen zu verstehen. Sie zeigen Ineffizienzen und den Ort wahrscheinlicher serverseitiger Engpässe.

Query Explain:

  • Bietet Einblicke in die Abfrageplanungsphase, damit Sie Ihre Abfrage indexe anpassen und die Effizienz steigern können.
  • Mit der Option „Analysieren“ können Sie Kosten und Leistung pro Abfrage nachvollziehen und schnell verschiedene Abfragemuster durchgehen, um ihre Nutzung zu optimieren.

Optionen von Query Explain: „Standard“ und „Analysieren“

Query Explain-Vorgänge können mit der Option Standard oder Analysieren ausgeführt werden.

Bei der Standardoption plant Query Explain die Abfrage, überspringt aber die Ausführungsphase. 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. Sie können beispielsweise prüfen, ob eine bestimmte Abfrage einen zusammengesetzten Index verwendet, anstatt viele verschiedene Indexe zu schneiden.

Bei der Option „Analysieren“ plant und führt Query Explain die Abfrage aus. Dadurch werden alle zuvor genannten Informationen zur Planung sowie Statistiken aus der Abfrageausführungszeit zurückgegeben. Dazu gehören die Abrechnungsinformationen der Abfrage sowie Einblicke auf Systemebene in die Abfrageausführung. Mit diesem Tool können Sie verschiedene Abfrage- und Index konfigurationen testen, um Kosten und Latenz zu optimieren.

Was kostet Query Explain?

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 „Analysieren“ verwenden, werden Index- und Lesevorgänge ausgeführt. Daher werden Ihnen die Kosten für die Abfrage wie gewohnt in Rechnung gestellt. Für die Analyseaktivität fallen keine zusätzlichen Kosten an, sondern nur die üblichen Kosten für die Ausführung der Abfrage.

Query Explain mit der Standardoption verwenden

Sie können die Clientbibliotheken verwenden, um eine Anfrage mit der Standardoption zu senden.

Anfragen werden mit IAM authentifiziert. Dabei werden dieselben Berechtigungen wie für reguläre Abfragevorgänge verwendet. Andere Authentifizierungsmethoden 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();

    
Node (Admin)

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 Query Explain-Bericht.

Query Explain mit der Option „Analysieren“ verwenden

Sie können die Clientbibliotheken verwenden, um eine Anfrage mit der Option „Analysieren“ zu senden.

Anfragen werden mit IAM authentifiziert. Dabei werden dieselben Berechtigungen wie für reguläre Abfragevorgänge verwendet. Andere Authentifizierungsmethoden 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();

    
Node (Admin)

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;

    

Im folgenden Beispiel wird das Objekt stats zusätzlich zu planInfo zurückgegeben. 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 Query Explain-Bericht.

Ergebnisse interpretieren und Anpassungen vornehmen

Sehen wir uns ein Beispielszenario an, in dem wir Filme nach Genre und Produktionsland abfragen.

Zur Veranschaulichung nehmen wir die folgende SQL-Abfrage an.

SELECT *
FROM /movies
WHERE category = 'Romantic' AND country = 'USA';

Wenn wir die Option „Analysieren“ 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 „Analysieren“ ausführen, sehen wir, dass der neu erstellte Index für diese Abfrage ausgewählt wurde. Die Abfrage wird viel schneller und effizienter ausgeführt.

// 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",
               }
    }
}