View a markdown version of this page

Análise do plano de consulta - Amazon DocumentDB

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Análise do plano de consulta

A análise do plano de consulta por meio do plano de explicação fornece informações essenciais sobre o desempenho das consultas do Amazon DocumentDB. O plano de consulta com ExecutionStats revela as principais métricas, incluindo:

  • Documentos devolvidos por estágio (nReturned)

  • Tempos de execução específicos do estágio (estimativa) executionTimeMillis

  • Duração da geração do plano (planningTimeMillis)

Ao examinar a saída do plano de consulta, os desenvolvedores podem analisar os padrões de execução, avaliar a utilização do índice e identificar possíveis oportunidades de otimização nos estágios do pipeline de consulta.

Para analisar o plano de consulta, você pode usar o comando explain () nos formatos a seguir.

db.runCommand({explain: {query document}, verbosity: "executionStats"}) db.collection.find().explain("executionStats");

Veja a seguir um exemplo de operação:

db.collection.find({ companyname: { '$eq': 'ANYCOMPANY' }, isDeleted: { '$eq': false } }).sort({"createdAt":1}).limit(2).explain("executionStats");

A saída dessa operação é semelhante à seguinte:

{ queryPlanner: { plannerVersion: 2, namespace: 'limit_test.test', winningPlan: { stage: 'LIMIT_SKIP', inputStage: { stage: 'SORT', sortPattern: { createdAt: 1 }, inputStage: { stage: 'IXSCAN', indexName: 'companyname_1_createdAt_1_isDeleted_1', direction: 'forward', indexCond: { '$and': [ { companyname: { '$eq': 'ANYCOMPANY' } }, { isDeleted: { '$eq': false } } ] } } } } }, indexFilterSet: false, indexFilterApplied: false, executionStats: { executionSuccess: true, executionTimeMillis: '4.186', planningTimeMillis: '3.909', executionStages: { stage: 'LIMIT_SKIP', nReturned: '2', executionTimeMillisEstimate: '0.199', inputStage: { stage: 'SORT', nReturned: '2', executionTimeMillisEstimate: '0.197', sortPattern: { createdAt: 1 }, inputStage: { stage: 'IXSCAN', nReturned: '34', executionTimeMillisEstimate: '0.151', indexName: 'companyname_1_createdAt_1_isDeleted_1', direction: 'forward', indexCond: { '$and': [ { companyname: { '$eq': 'ANYCOMPANY' } }, { isDeleted: { '$eq': false } } ] } } } } }, serverInfo: { host: 'demo-cluster', port: 27017, version: '5.0.0' }, ok: 1, operationTime: Timestamp({ t: 1759915116, i: 1 }) }

Abaixo está uma análise detalhada de um plano de execução de consultas do Amazon DocumentDB, detalhando cada componente e suas características de desempenho.

Cronometragem geral

executionTimeMillis representa o tempo total gasto pela consulta, incluindo o tempo de planejamento.

planningTimeMillis representa o tempo total de planejamento gasto pela consulta.

Estágios de execução

Ele descreve o step-by-step processo que o Amazon DocumentDB usa para executar uma consulta, mostrando como os dados fluem por meio de diferentes operações.

"executionStages": { "stage": "[STAGE_NAME]", "nReturned": "[NUMBER_OF_DOCS]", "executionTimeMillisEstimate": "[TIME]", "inputStage": { // Nested stages } }

Estágios comuns em um plano de consulta

Abaixo estão os estágios comuns de execução em um plano de consulta. Cada estágio retorna as métricas executionTimeMillis Estimate (tempo de execução) e nReturned (número de documentos) para ajudar a avaliar o desempenho da consulta em cada estágio.

COLLSCAN (Digitalização de coleção)

  • Digitaliza todo o documento da coleção por documento

  • nReturned: retorna todos os documentos correspondentes na coleção

  • Pode ser uma operação cara, vista quando nenhum índice está disponível

IXSCAN (Digitalização de índice)

  • Usa um índice para encontrar documentos correspondentes

  • nReturned: Somente documentos correspondentes com base no índice

  • Operação eficiente, preferida ao COLLSCAN

SORT

  • Classifica documentos com base em campos especificados

  • Se o atributo de classificação na consulta não fizer parte de um índice, esse estágio aparecerá explicitamente

  • nRetornado: Mesmo número dos documentos de entrada

  • Consome muita memória para grandes conjuntos de resultados. Para otimizar, adicione o nome do campo de classificação a um índice

LIMIT_SKIP

  • Controla o número de documentos devolvidos e ignorados

  • nRetornado: Limitado pelo valor LIMITE

  • Usado para operações de paginação ou LIMIT

SUBVARREDURA

  • Executa operações de consulta aninhadas

  • nReturned: varia com base nos resultados da subconsulta

  • Usado em consultas complexas com vários estágios

Estágios com alta executionTimeMillis estimativa são bons candidatos para otimização.

nota

No momento, o parâmetro ExecutionStats não oferece suporte aos comandos de atualização e exclusão.

Compreendendo os documentos examinados em Explique as estatísticas de execução do plano

Quando você executa uma consulta comexplain("executionStats"), o Amazon DocumentDB fornece métricas de exame que ajudam você a entender quantos documentos foram digitalizados para produzir os resultados da consulta. Essas métricas são úteis para identificar planos de consulta ineficientes e otimizar o desempenho.

nota

Disponível somente no Amazon DocumentDB 8.0.0+.

Campos

Campo Description Nível
totalDocsExamined Número total de documentos examinados em todos os estágios de execução. ExecutionStats de alto nível
Documentos examinados Número de documentos examinados por um estágio específico de execução. Nível de estágio

O docsExamined campo aparece nos seguintes estágios:

Estágio Description
COLLSCAN Digitalização da coleção. Todos os documentos da coleção são examinados.
IXSCAN Escaneamento de índice. Somente documentos que correspondam à condição do índice são examinados.
FETCH Quando o otimizador recupera documentos em um estágio separado do IXSCAN, o estágio FETCH relata DocsExamined. Nos planos de escaneamento de índice, os estágios secundários do IXSCAN não relatam DocsExamined. Nos planos $lookup, tanto o estágio FETCH quanto seus estágios secundários podem relatar DocsExamined.
nota

docsExaminednão aparece nos estágios do IXONLYSCAN porque a consulta é satisfeita inteiramente a partir do índice sem acessar documentos.

Mostrar documentos examinados na saída do Explain Plan ExecutionStats

Os exemplos a seguir usam uma coleção com 500.000 documentos e demonstram como isso docsExamined muda em diferentes estágios de execução da consulta.

Crie dados de amostra:

for (let i = 0; i < 500000; i++) { db.coll.insertOne({ number: i, arr: [i, [i+1]], value: "test", bool: i % 2 === 0 }); }

Digitalização de coleção (COLLSCAN)

Sem um índice, o Amazon DocumentDB executa uma varredura completa da coleção.

db.coll.find({ "number": { "$lt": 500 } }).explain("executionStats").executionStats

Saída:

{ "executionSuccess" : true, "nReturned" : "500", "executionTimeMillis" : "282.055", "planningTimeMillis" : "0.085", "totalDocsExamined" : "500000", "executionStages" : { "stage" : "COLLSCAN", "nReturned" : "500", "executionTimeMillisEstimate" : "281.915", "docsExamined" : "500000", "filter" : { "number" : { "$lt" : 500 } } } }

Todos os 500.000 documentos foram examinados para retornar 500 resultados. Criar um índice no campo numérico melhora isso.

Análise de índice (IXSCAN)

db.coll.createIndex({ number: 1 }); db.coll.find({ "number": { "$lt": 5000 } }).explain("executionStats").executionStats

Saída:

{ "executionSuccess" : true, "nReturned" : "5000", "executionTimeMillis" : "3.047", "planningTimeMillis" : "0.296", "totalDocsExamined" : "5000", "executionStages" : { "stage" : "IXSCAN", "nReturned" : "5000", "executionTimeMillisEstimate" : "2.576", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5000", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5000 } } ] } } }

Com o índice, apenas 5.000 dos 500.000 documentos foram examinados e buscados, correspondendo ao número retornado. A condição do índice filtrou 495.000 documentos que não correspondiam à consulta.

Digitalização de índice com filtro residual

db.coll.find({ "number": { "$lt": 5000 }, "arr": { "$gt": 4000 } }).explain("executionStats").executionStats

Saída:

{ "executionSuccess" : true, "nReturned" : "999", "executionTimeMillis" : "15.367", "planningTimeMillis" : "0.115", "totalDocsExamined" : "5000", "executionStages" : { "stage" : "IXSCAN", "nReturned" : "999", "executionTimeMillisEstimate" : "15.170", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5000", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5000 } } ] }, "filter" : { "arr" : { "$gt" : 4000 } } } }

A condição do índice correspondeu a 5.000 documentos de 500.000 e, em seguida, o filtro residual arr reduziu o resultado para 999. O docsExamined valor de 5.000 reflete todos os documentos examinados após a condição do índice, mas antes da aplicação do filtro residual.

Busque com o IXSCAN

db.coll.find({ "$or": [{ "number": { "$lt": 100000 } }, { "number": { "$gt": 400000 } }] }).explain("executionStats").executionStats

Saída:

{ "executionSuccess" : true, "nReturned" : "199999", "executionTimeMillis" : "899.801", "planningTimeMillis" : "0.183", "totalDocsExamined" : "199999", "executionStages" : { "stage" : "FETCH", "nReturned" : "199999", "executionTimeMillisEstimate" : "894.141", "docsExamined" : "199999", "inputStage" : { "stage" : "IXOR", "nReturned" : "0", "executionTimeMillisEstimate" : "874.897", "inputStages" : [ { "stage" : "IXSCAN", "nReturned" : "100000", "executionTimeMillisEstimate" : "462.208", "indexName" : "number_1", "indexCond" : { "$and" : [ { "number" : { "$lt" : 100000 } } ] } }, { "stage" : "IXSCAN", "nReturned" : "99999", "executionTimeMillisEstimate" : "412.684", "indexName" : "number_1", "indexCond" : { "$and" : [ { "number" : { "$gt" : 400000 } } ] } } ] } } }

Quando o otimizador Amazon DocumentDB usa um estágio de busca para recuperar documentos, o estágio FETCH relata. docsExamined Os estágios secundários do IXSCAN não relatam docsExamined porque eles apenas digitalizam as chaves de índice sem acessar os documentos diretamente.

FETCH com pesquisa agregada

db.coll.explain("executionStats").aggregate([ { $match: { "number": { "$lt": 5 } } }, { $lookup: { from: "coll", pipeline: [{ $match: { "number": { "$lt": 3 } } }], as: "sub" } } ]).executionStats

Saída:

{ "executionSuccess" : true, "nReturned" : "5", "executionTimeMillis" : "0.525", "planningTimeMillis" : "0.327", "totalDocsExamined" : "9", "executionStages" : { "stage" : "NESTED_LOOP_LOOKUP", "nReturned" : "5", "executionTimeMillisEstimate" : "0.163", "inputStages" : [ { "stage" : "IXSCAN", "nReturned" : "5", "executionTimeMillisEstimate" : "0.039", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5 } } ] } }, { "stage" : "FETCH", "nReturned" : "1", "executionTimeMillisEstimate" : "0.009", "docsExamined" : "1", "inputStage" : { "stage" : "AGGREGATE", "nReturned" : "1", "executionTimeMillisEstimate" : "0.044", "inputStage" : { "stage" : "IXSCAN", "nReturned" : "3", "executionTimeMillisEstimate" : "0.013", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "3", "indexCond" : { "$and" : [ { "number" : { "$lt" : 3 } } ] } } } } ] } }

O IXSCAN externo examinou 5 documentos com números menores que 5. O IXSCAN interno examinou 3 documentos com número < 3, e o estágio FETCH examinou 1 resultado agregado. O totalDocsExamined de 9 é a soma de todos os estágios (5 + 3 + 1).