Abfrageleistung mit „Query Explain“ verstehen

Mit Query Explain können Sie Firestore-Abfragen an das Back-End senden und detaillierte Leistungsstatistiken zur Ausführung von Back-End-Abfragen erhalten. Er funktioniert wie der EXPLAIN [ANALYZE]-Vorgang in vielen relationalen Datenbanksystemen.

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

Die Ergebnisse von „Query Explain“ helfen Ihnen zu verstehen, wie Ihre Abfragen ausgeführt werden. Sie zeigen Ihnen Ineffizienzen und mögliche serverseitige Engpässe auf.

Erläuterung der Suchanfrage:

  • Bietet Einblicke in die Planungsphase von Abfragen, damit Sie Ihre Abfrageindexe anpassen und die Effizienz steigern können.
  • Die Analyseoption hilft Ihnen, Ihre Kosten und Leistung auf Abfragebasis zu verstehen und schnell durch verschiedene Abfragemuster zu iterieren, um deren Nutzung zu optimieren.

Erläuterung der Optionen für Abfrageerklärung: Standard und Analyse

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

Bei der Standardoption plant Query Explain die Abfrage, aber die Ausführungsphase wird übersprungen. Dadurch werden Informationen zur Planerphase zurückgegeben. So können Sie prüfen, ob eine Abfrage über die erforderlichen Indexe verfügt und welche Indexe verwendet werden. So können Sie beispielsweise überprüfen, ob eine bestimmte Abfrage einen zusammengesetzten Index verwendet, anstatt sich über viele verschiedene Indexe hinweg zu überschneiden.

Mit der Analyseoption wird „Query Explain“ beide Pläne ausgeführt und die Abfrage ausgeführt. Dadurch werden alle zuvor genannten Planerinformationen sowie Statistiken aus der Ausführungslaufzeit der Abfrage zurückgegeben. Dazu gehören die Abrechnungsinformationen der Abfrage sowie Statistiken auf Systemebene zur Abfrageausführung. Sie können dieses Tool verwenden, um verschiedene Abfrage- und Indexkonfigurationen zu 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 Analyseoption verwenden, werden Index- und Lesevorgänge ausgeführt, sodass die Abfrage wie gewohnt in Rechnung gestellt wird. Es fallen keine zusätzlichen Kosten für die Analyseaktivität 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 für Standardoptionen zu senden.

Anfragen werden mit IAM authentifiziert, wobei dieselben Berechtigungen für reguläre Abfragevorgänge verwendet werden. Andere Authentifizierungstechniken wie Firebase Authentication werden ignoriert. Weitere Informationen finden Sie in der Anleitung 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 das JSON-Format 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 Analyseoption verwenden

Mit den Clientbibliotheken können Sie eine Anfrage für die Analyseoption senden.

Anfragen werden mit IAM authentifiziert, wobei dieselben Berechtigungen für reguläre Abfragevorgänge verwendet werden. Andere Authentifizierungstechniken wie Firebase Authentication werden ignoriert. Weitere Informationen finden Sie in der Anleitung zu 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 wurde. 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 Beispielszenario an, in dem wir Filme nach Genre und Produktionsland abfragen.

Nehmen wir zur Veranschaulichung die Entsprechung dieser SQL-Abfrage an.

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

Wenn wir die Option „Analysieren“ verwenden, zeigen die zurückgegebenen Messwerte an, dass die Abfrage für zwei Einzelfeldindexe ausgeführt wird: (category ASC, __name__ ASC) und (country ASC, __name__ ASC). Sie scannt 16.500 Indexeinträge, gibt aber nur 1.200 Dokumente zurück.

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

Sie können einen vollständig abgedeckten zusammengesetzten Index (category ASC, country ASC, __name__ ASC) erstellen, um die Leistung beim Ausführen der Abfrage zu optimieren.

Wenn Sie die Abfrage noch einmal mit der Analyseoption ausführen, sehen Sie, 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",
               }
    }
}