Abfrageausführung mit „Abfrage erläutern“ analysieren

Auf dieser Seite wird beschrieben, wie Sie Informationen zur Abfrageausführung abrufen, wenn Sie eine Abfrage ausführen.

Query Explain verwenden

Mit Query Explain können Sie nachvollziehen, wie Ihre Abfragen ausgeführt werden. Hier finden Sie Details, mit denen Sie Ihre Abfragen optimieren können.

Sie können Query Explain über die Firebase Console oder die Firestore-Server-Clientbibliotheken verwenden.

Console
  1. Rufen Sie in der Firebase Console Datenbanken und Speicher > Firestore > Daten > Abfrageeditor auf.

  2. Führen Sie die Abfrage aus, für die Sie Ausführungsinformationen erhalten möchten.
  3. Klicken Sie auf den Tab Query Explain, um die Ausgabe der Abfrageanalyse aufzurufen.
Node.js (Admin)
import { field } from '@google-cloud/firestore/pipelines';

const q = db.pipeline()
        .collection('/users')
        .sort(field('status').ascending())
        .limit(100);
let results;
try {
    results = await q.execute({
        explainOptions: { mode: 'analyze', outputFormat: 'text' }
    });
} catch (error) {
    console.log(error);
}
const metrics = results?.explainStats?.text;

console.log(metrics);
Java (Admin)
Pipeline q = db.pipeline()
        .collection("/users")
        .sort(field("status").ascending())
        .limit(100);

PipelineExecuteOptions pipelineOpts = new PipelineExecuteOptions().withExplainOptions(
        new ExplainOptions().withExecutionMode(ExplainOptions.ExecutionMode.ANALYZE)
);
Pipeline.Snapshot result = q.execute(pipelineOpts).get();

String metrics = null;
if (result.getExplainStats() != null) {
    metrics = result.getExplainStats().getText();
    System.out.println(metrics);
}

Modi erklären

Je nachdem, was Sie debuggen möchten, können Sie eine Abfrage mit Query Explain in verschiedenen Modi ausführen:

  • analyze: Plant die Abfrage und führt sie aus. Gibt Planerinformationen, Laufzeit-Ausführungsstatistiken und Messwerte zusammen mit den regulären Ergebnissen der Abfrage zurück.

  • explain: Plant die Abfrage, führt sie aber nicht aus. Gibt die Planerinformationen zurück, aber keine Laufzeitstatistiken, Messwerte oder Ergebnisse. Dies ist nützlich, um das Verhalten einer Abfrage zu debuggen, ohne kostspielige Vorgänge auszuführen.

  • stats: Plant die Abfrage und führt sie aus, gibt aber keine Ergebnisse zurück. Gibt Planerinformationen, Laufzeitstatistiken und Messwerte zurück.

Analyse

Die Ausgabe von Query Explain enthält zwei Hauptkomponenten: die Zusammenfassungsstatistiken und den Ausführungsbaum. Betrachten Sie die folgende Abfrage als Beispiel:

db.pipeline().collection('/users').sort(field("status").ascending()).limit(100)

Zusammenfassende Statistiken

Oben in der erläuterten Ausgabe finden Sie eine Zusammenfassung der Ausführungsstatistiken. Anhand dieser Statistiken können Sie feststellen, ob eine Abfrage eine hohe Latenz oder hohe Kosten verursacht. Außerdem enthält sie Speicherstatistiken, die Aufschluss darüber geben, wie nah Ihre Abfrage an den Speicherlimits ist.

Execution:
 results returned: 2
 request peak memory usage: 20.25 KiB (20,736 B)
 data bytes read: 148 B
 entity row scanned: 2

Billing:
 read units: 1

Ausführungsstruktur

Die Ausführungsstruktur beschreibt die Abfrageausführung als eine Reihe von Knoten. Die unteren Knoten (Blattknoten) rufen Daten aus der Speicherebene ab, die im Baum nach oben wandern, um eine Abfrageantwort zu generieren.

Weitere Informationen zu den einzelnen Ausführungsknoten finden Sie in der Ausführungsreferenz.

Weitere Informationen dazu, wie Sie diese Informationen zur Optimierung Ihrer Abfragen verwenden, finden Sie unter Abfrageausführung optimieren.

Hier ein Beispiel für einen Ausführungsbaum:

Tree:
• Compute
|  $out_1: map_set($record_1, "__name__", $__name___1, "__key__", unset)
|  is query result: true
|
|  Execution:
|   records returned: 2
|   latency: 5.96 ms (local <1 ms)
|
└── • Compute
    |  $__name___1: map_get($record_1, "__key__")
    |
    |  Execution:
    |   records returned: 2
    |   latency: 5.88 ms (local <1 ms)
    |
    └── • MajorSort
        |  fields: [$v_1 ASC]
        |  output: [$record_1]
        |  limit: 100
        |
        |  Execution:
        |   records returned: 2
        |   latency: 5.86 ms (local <1 ms)
        |   peak memory usage: 20.25 KiB (20,736 B)
        |
        └── • Compute
            |  $v_1: map_get($record_1, "status")
            |
            |  Execution:
            |   records returned: 2
            |   latency: 5.23 ms (local <1 ms)
            |
            └── • TableScan
                   source: /users
                   order: UNDEFINED
                   properties: *
                   row range: (-∞..+∞)
                   output record: $record_1
                   variables: [$record_1]

                   Execution:
                    records returned: 2
                    latency: 4.68 ms
                    records scanned: 2
                    data bytes read: 148 B

Nächste Schritte