Analise a execução de consultas com a explicação de consultas

Esta página descreve como obter informações de execução de consultas quando executa uma consulta.

Use a explicação de consultas

Pode usar a explicação de consultas para compreender como as suas consultas estão a ser executadas. Isto fornece detalhes que pode usar para otimizar as suas consultas.

Pode usar o comando Query Explain através da Google Cloud consola ou do comando explain.

Consola

Execute uma consulta no editor de consultas e abra o separador Explicação:

  1. Na Google Cloud consola, aceda à página Bases de dados.

    Aceda a Bases de dados

  2. Na lista de bases de dados, selecione uma base de dados do Firestore com compatibilidade com o MongoDB. A Google Cloud consola abre o Explorador do Firestore para essa base de dados.
  3. Introduza uma consulta no editor de consultas e clique em Executar.
  4. Clique no separador Explicação para ver o resultado da análise de consultas.

    Separador Query Explain na consola
API MongoDB

A consulta Explain na API MongoDB é suportada através do comando explain que pode usar em ferramentas como o Mongo Shell e o Compass.

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

db.collection.explain('executionStats').find(...)

Também pode usar o método explain(), por exemplo:

db.collection.find({QUERY}).explain('executionStats')
Limitações
Tenha em atenção as seguintes limitações e diferenças:
  • O comando Explain da consulta não suporta comandos que devolvem um cursor. Por exemplo, não é suportado invocar a funcionalidade de explicação chamando diretamente o seguinte comando:

    db.collection.aggregate(..., explain: true)
  • O comando Query Explain só é suportado nos comandos find, aggregate, count e distinct.

  • As opções Verbosity e Comment de Query Explain não são suportadas através da API MongoDB. O comportamento corresponde à opção executionStats. As opções allPlansExecution e queryPlanner são ignoradas, se forem fornecidas.

    Se não for fornecida nenhuma verbosidade, a shell usa a queryPlanner verbosidade e filtra as estatísticas de execução. Tem de usar a verbosidade executionStats ou allPlansExecution para ver o resultado completo.

Análise

O resultado do comando 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 superior da saída explicada contém um resumo das estatísticas de execução. Use estas estatísticas para determinar se uma consulta tem uma latência ou um custo elevado. Também contém estatísticas de memória que lhe indicam a proximidade da sua consulta aos 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) obtêm dados da camada de armazenamento que percorre a árvore para cima para gerar uma resposta à consulta.

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

Para ver detalhes sobre como usar estas informações para otimizar as suas consultas, consulte o artigo Otimize a execução de consultas.

Segue-se um exemplo de uma á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

O que se segue?