O Query Explain permite enviar consultas do modo Datastore para o back-end e receber estatísticas detalhadas de desempenho sobre a execução de consultas de back-end em troca. Ela funciona como a operação EXPLAIN ANALYZE em muitas sistemas banco de dados relacional.
É possível enviar solicitações do Query Explain usando as bibliotecas de cliente do modo Datastore.
Os resultados do Query Explain ajudam a entender como suas consultas são executadas, mostrando ineficiências e o local de prováveis gargalos do lado do servidor.
Explicação da consulta:
- Fornece insights sobre a fase de planejamento para que você possa ajustar seus índices de consulta e aumentar a eficiência.
- Ajuda você a entender o custo e o desempenho por consulta e permite acessar rapidamente diferentes tipos de personalizados para otimizar o uso deles.
Entender as opções de Query Explain: default e analyze
As operações do Query Explain podem ser realizadas usando a opção default ou analyze.
Com a opção padrão, a explicação de consulta planeja a consulta, mas ignora no estágio de execução. Isso retornará informações do estágio do planejador. Você pode use isso para verificar se uma consulta tem os índices necessários e entender quais índices são usados. Isso o ajudará a verificar, por exemplo, se uma determinada consulta está usando um índice composto e ter de cruzar com muitas índices.
Com a opção de análise, a consulta explica os dois planos e executa o consulta. Isso retorna todas as informações do planejador mencionadas anteriormente, juntamente com estatísticas do ambiente de execução da consulta. Isso incluirá informações de faturamento, além de insights no nível do sistema sobre a execução da consulta. É possível usar essas ferramentas para testar várias consultas e configurações para otimizar o custo e a latência.
Qual é o custo da Query Explain?
Quando uma consulta é explicada com a opção padrão, nenhuma índice ou operações de leitura são realizados. Independentemente da complexidade da consulta, uma operação de leitura é cobrada.
Quando uma consulta é explicada com a opção de análise, operações de índice e leitura são executadas, portanto, a consulta é cobrada normalmente. Não há nenhum valor adicional pela atividade de análise, apenas a cobrança normal pela consulta sendo executado.
Executar uma consulta com a opção padrão
Você pode usar uma biblioteca de cliente para enviar uma solicitação de opção padrão.
Os resultados da explicação da consulta são autenticados com Identity and Access Management, usando as mesmas permissões para operações de consulta regulares.
Java
Para aprender a instalar e usar a biblioteca de cliente para o modo Datastore, consulte as bibliotecas de cliente do modo Datastore. Para mais informações, consulte a documentação de referência da APIJava do modo Datastore.
Para autenticar no modo Datastore, configure o Application Default Credentials. Se quiser mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Consulte o campo indexes_used na resposta para saber mais sobre os índices usados no plano de consulta:
"indexes_used": [
{"query_scope": "Collection Group", "properties": "(__name__ ASC)"},
]Para mais informações sobre o relatório, consulte a referência do relatório.
Executar uma consulta com a opção de análise
Você pode usar uma biblioteca de cliente para enviar uma solicitação de opção padrão.
Os resultados da análise de consulta são autenticados com Identity and Access Management (IAM), usando as mesmas permissões para operações de consulta regulares.
Java
Para aprender a instalar e usar a biblioteca de cliente para o modo Datastore, consulte as bibliotecas de cliente do modo Datastore. Para mais informações, consulte a documentação de referência da APIJava do modo Datastore.
Para autenticar no modo Datastore, configure o Application Default Credentials. Se quiser mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Consulte o objeto executionStats para encontrar informações de criação de perfil de consulta, como:
{
"resultsReturned": "5",
"executionDuration": "0.100718s",
"readOperations": "5",
"debugStats": {
"index_entries_scanned": "95000",
"documents_scanned": "5"
"billing_details": {
"documents_billable": "5",
"index_entries_billable": "0",
"small_ops": "0",
"min_query_cost": "0",
}
}
}Para mais informações sobre o relatório, consulte a referência do relatório.
Interpretar resultados e fazer ajustes
O cenário de exemplo a seguir consulta filmes por gênero e país de produção e demonstra como otimizar os índices usados pela consulta.
Para mais informações sobre o relatório, consulte a referência de relatório do Query Explain.
Para ilustração, suponha o equivalente desta consulta SQL.
SELECT * FROM movies WHERE category = 'Romantic' AND country = 'USA';
Se usarmos a opção de análise, a saída do relatório a seguir vai mostrar a consulta é executada em índices de campo único (category ASC, __name__ ASC) e (country ASC, __name__ ASC). Ele verifica 16.500 entradas de índice, mas retorna somente 1.200 documentos.
// Output query planning info "indexes_used": [ {"query_scope": "Collection Group", "properties": "(category ASC, __name__ ASC)"}, {"query_scope": "Collection Group", "properties": "(country ASC, __name__ ASC)"}, ] // Output query status { "resultsReturned": "1200", "executionDuration": "0.118882s", "readOperations": "1200", "debugStats": { "index_entries_scanned": "16500", "documents_scanned": "1200" "billing_details": { "documents_billable": "1200", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }
Para otimizar o desempenho da execução da consulta, crie um índice composto completamente coberto (category ASC, country ASC, __name__ ASC).
Ao executar a consulta no modo de análise novamente, podemos ver um índice recém-criado é selecionado para essa consulta, e a consulta é executada muito mais rápido cada vez mais eficientes.
// Output query planning info "indexes_used": [ {"query_scope": "Collection Group", "properties": "(category ASC, country ASC, __name__ ASC)"} ] // Output query stats { "resultsReturned": "1200", "executionDuration": "0.026139s", "readOperations": "1200", "debugStats": { "index_entries_scanned": "1200", "documents_scanned": "1200" "billing_details": { "documents_billable": "1200", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }