Abfrageleistung mit Query Explain verstehen

Mit Query Explain können Sie Firestore-Abfragen an den Backend und erhalten detaillierte Leistungsstatistiken zur Ausführung von Backend-Abfragen im Gegenzug erhalten. Sie funktioniert in vielen Fällen wie die EXPLAIN [ANALYZE]-Operation. relationale Datenbanksysteme.

Query Explain-Anfragen können mithilfe der Firestore-Server-Clientbibliotheken gesendet werden.

Die Ergebnisse der Abfrageerläuterung helfen Ihnen zu verstehen, wie Ihre Abfragen ausgeführt werden. Sie sehen Ineffizienzen und die Standorte wahrscheinlicher serverseitiger Engpässe.

Erklärende Abfrage:

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

Optionen für die Abfrageerläuterung: Standard und analysieren

Abfrageerläuterungen können mit der Option standard oder analysieren ausgeführt werden.

Bei der Standardoption plant Query Explain die Abfrage, überspringt aber der Ausführungsphase. Dadurch werden Informationen zur Planungsphase zurückgegeben. Sie können können Sie so prüfen, ob eine Abfrage über die erforderlichen Indexe verfügt, und ermitteln, Indexe verwendet werden. So können Sie z. B. prüfen, ob eine bestimmte verwendet einen zusammengesetzten Index, anstatt sich mit vielen verschiedenen Indexe.

Mit der Analyseoption erstellt Query Explain beide Pläne und führt die Abfrage aus. Dadurch werden alle zuvor genannten Informationen zum Planer sowie Statistiken zur Ausführungszeit der Abfrage zurückgegeben. Dies beinhaltet die Abrechnung Informationen der Abfrage und Statistiken auf Systemebene Ausführung. Mit diesem Tool können Sie verschiedene Abfrage- und um Kosten und Latenz zu optimieren.

Was kostet die Funktion „Abfrageerläuterung“?

Wenn Sie Query Explain mit der Standardoption verwenden, gibt es keine Index- oder Lesevorgänge durchgeführt werden. Unabhängig von der Komplexität der Abfrage wird ein Lesevorgang berechnet.

Wenn Sie Query Explain mit der Analyseoption verwenden, werden Index- und Lesevorgänge durchgeführt werden, sodass Ihnen die Abfrage wie gewohnt in Rechnung gestellt wird. Für die Analyseaktivität fallen keine zusätzlichen Kosten an, 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 und dabei dieselben Berechtigungen wie für reguläre Abfragevorgänge verwendet. Andere Authentifizierungstechniken wie Firebase Authentication werden sie ignoriert. Weitere Informationen finden Sie im Leitfaden zu IAM für Server-Clientbibliotheken.

Java (Administrator)

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. Die zurückgegebenen 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 „Erläuterung von Abfragen“.

Query Explain mit der Analyseoption verwenden

Sie können die Clientbibliotheken verwenden, um eine Anfrage zur Analyseoption zu senden.

Anfragen werden mit IAM authentifiziert und dabei dieselben Berechtigungen wie für reguläre Abfragevorgänge verwendet. Andere Authentifizierungsmethoden wie die Firebase-Authentifizierung werden ignoriert. Weitere Informationen finden Sie im Leitfaden zur IAM für Server-Clientbibliotheken

Java (Administrator)

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 ist im 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 „Erläuterung von Abfragen“.

Ergebnisse interpretieren und Anpassungen vornehmen

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

Nehmen wir zur Veranschaulichung an, dass das Äquivalent zu dieser SQL-Abfrage verwendet wird.

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

Wenn wir die Option „Analysieren“ verwenden, zeigen die zurückgegebenen Messwerte die Abfrage wird auf zwei Einzelfeldindexen ausgeführt, (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 beim Ausführen der Abfrage zu optimieren, können Sie einen vollständig abgedeckter zusammengesetzter Index (category ASC, country ASC, __name__ ASC).

Wenn wir die Abfrage noch einmal mit der Option „Analysieren“ ausführen, Für diese Abfrage wird ein neu erstellter Index ausgewählt und die Abfrage wird viel schneller ausgeführt und effizienter zu gestalten.

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