Analyser l'exécution des requêtes avec Query Explain

Cette page explique comment récupérer des informations sur l'exécution des requêtes lorsque vous exécutez une requête.

Utiliser Query Explain

Utilisez Query Explain pour comprendre comment vos requêtes sont exécutées. Vous obtiendrez ainsi des informations détaillées que vous pourrez utiliser pour optimiser vos requêtes.

Vous pouvez utiliser Query Explain via la Google Cloud console ou à l'aide des bibliothèques clientes du serveur Firestore.

Console

Exécutez une requête dans l'éditeur de requête et ouvrez l'onglet Explication :

  1. Dans la Google Cloud console, accédez à la page Bases de données.

    Accéder à la page "Bases de données"

  2. Dans la liste des bases de données, sélectionnez une base de données Firestore. La Google Cloud console ouvre l'explorateur Firestore pour cette base de données.
  3. Saisissez une requête dans l'éditeur de requête, puis cliquez sur Exécuter.
  4. Cliquez sur l'onglet Explication pour afficher le résultat de l'analyse de la requête.

Node.js (administrateur)
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 (administrateur)
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);
}

Modes d'explication

Selon ce que vous souhaitez déboguer, vous pouvez exécuter une requête avec Query Explain dans différents modes :

  • analyze: planifie et exécute la requête. Renvoie des informations sur le planificateur, des statistiques et des métriques d'exécution, ainsi que les résultats habituels produits par la requête.

  • explain: planifie la requête, mais ne l'exécute pas. Renvoie les informations du planificateur, mais aucune statistique, métrique ni résultat d'exécution. Cela est utile pour déboguer le comportement d'une requête sans exécuter d'opérations coûteuses.

Analyse

Le résultat de Query Explain contient deux composants principaux : les statistiques récapitulatives et l'arborescence d'exécution. Prenons l'exemple de cette requête :

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

Statistiques récapitulatives

En haut du résultat expliqué se trouve un résumé des statistiques d'exécution. Utilisez ces statistiques pour déterminer si une requête présente une latence ou un coût élevés. Il contient également des statistiques sur la mémoire qui vous indiquent si votre requête est proche des limites de mémoire.

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

Arborescence d'exécution

L'arborescence d'exécution décrit l'exécution de la requête sous forme de série de nœuds. Les nœuds inférieurs (nœuds feuilles) récupèrent les données de la couche de stockage, qui remonte dans l'arborescence pour générer une réponse à la requête.

Pour en savoir plus sur chaque nœud d'exécution, consultez la documentation de référence sur l'exécution.

Pour savoir comment utiliser ces informations afin d'optimiser vos requêtes, consultez la page Optimiser l'exécution des requêtes.

Voici un exemple d'arborescence d'exécution :

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

Étape suivante