Analisar a execução de consultas com o Query Explain

Relevante apenas para a edição Enterprise do Cloud Firestore.

Esta página descreve como recuperar informações de execução de consultas ao executar uma consulta.

Usar o Query Explain

Use o Query Explain para entender como suas consultas estão sendo executadas. Isso fornece detalhes que podem ser usados para otimizar suas consultas.

É possível usar a explicação de consultas no console do Google Cloud ou com o comando explain.

Console

Execute uma consulta no Editor de consultas e abra a guia Explicação:

  1. No Console do Google Cloud, acesse a página Bancos de Dados.

    Acessar "Bancos de dados"

  2. Na lista de bancos de dados, selecione um banco de dados do Cloud Firestore com compatibilidade com o MongoDB. O console do Google Cloud abre o Firestore Explorer para esse banco de dados.
  3. Insira uma consulta no editor e clique em Executar.
  4. Clique na guia Explicação para conferir a saída da análise de consulta.

    A guia "Explicar consulta" no console
API MongoDB

A explicação de consultas na API MongoDB é compatível com o comando explain que pode ser usado em ferramentas como o Mongo Shell e o Compass.

O comando explain é compatível com os comandos aggregate, find, distinct e count. Por exemplo:

db.collection.explain.find(...)

Você também pode usar o método explain(), por exemplo:

db.collection.find({QUERY}).explain()
Limitações
Observe as seguintes limitações e diferenças:
  • O Query Explain não é compatível com comandos que retornam um cursor. Por exemplo, não é possível invocar a explicação chamando o seguinte comando diretamente:

    db.collection.aggregate(..., explain: true)
  • A explicação de consultas só é compatível com os comandos find, aggregate, count e distinct.

  • As opções Verbosity e Comment do Query Explain não são compatíveis com a API do MongoDB. O comportamento corresponde à opção executionStats. As opções allPlansExecution e queryPlanner são ignoradas se forem fornecidas.

Análise

A saída do Query Explain contém dois componentes principais: as estatísticas de resumo e a árvore de execução. Considere esta consulta como exemplo:

db.order.aggregate(
 [
   { "$match": { "user_id": 1234 } },
   { "$sort": { "date_placed": 1 } }
 ]
)

Estatísticas de resumo

A parte de cima da saída explicada contém um resumo das estatísticas de execução. Use essas estatísticas para determinar se uma consulta tem alta latência ou custo. Além disso, contém estatísticas de memória que informam se a consulta está próxima dos limites de memória.

Billing Metrics:
read units: 1

Execution Metrics:
request peak memory usage: 4.00 KiB (4,096 B)
results returned: 1

Árvore de execução

A árvore de execução descreve a execução da consulta como uma série de nós. Os nós inferiores (nós folha) recuperam dados da camada de armazenamento, que percorre a árvore para gerar uma resposta de consulta.

Para detalhes sobre cada nó de execução, consulte a Referência de execução.

Para saber como usar essas informações para otimizar suas consultas, consulte Otimizar a execução de consultas.

Confira um exemplo de árvore de execução:

• Compute
|  $out_1: map_set($record_1, "__id__", $__id___1, "__key__", $__key___1, "__row_id__", $__row_id___1, "__$0__", $__$0___2)
|  is query result: true
|
|  Execution:
|   records returned: 1
|
└── • Compute
    |  $__$0___2: UNSET
    |
    |  Execution:
    |   records returned: 1
    |
    └── • Compute
        |  $__key___1: UNSET
        |  $__row_id___1: UNSET
        |
        |  Execution:
        |   records returned: 1
        |
        └── • Compute
            |  $__id___1: _id($record_1.__key__)
            |
            |  Execution:
            |   records returned: 1
            |
            └── • MajorSort
                |  fields: [$v_5 ASC]
                |  output: [$record_1]
                |
                |  Execution:
                |   records returned: 1
                |   peak memory usage: 4.00 KiB (4,096 B)
                |
                └── • Compute
                    |  $v_5: array_get($v_4, 0L)
                    |
                    |  Execution:
                    |   records returned: 1
                    |
                    └── • Compute
                        |  $v_4: sortPaths(array($record_1.date_placed), [date_placed ASC])
                        |
                        |  Execution:
                        |   records returned: 1
                        |
                        └── • Filter
                            |  expression: $eq($user_id_1, 1,234)
                            |
                            |  Execution:
                            |   records returned: 1
                            |
                            └── • TableScan
                                   source: **/my_collection
                                   order: STABLE
                                   properties: * - { __create_time__, __update_time__ }
                                   output record: $record_1
                                   output bindings: {$user_id_1=user_id}
                                   variables: [$record_1, $user_id_1]

                                   Execution:
                                    records returned: 1
                                    records scanned: 1

A seguir