Otimizar o desempenho da consulta
Para resolver problemas de consultas lentas, use o Query Explain para acessar o plano de execução da consulta e o perfil de execução de ambiente de execução. Nesta seção, descrevemos as etapas que podem ser seguidas para otimizar o desempenho da consulta, dependendo do perfil de execução:
Limitar o número de resultados
Use o campo de registros retornados na árvore de execução para identificar se a consulta está retornando muitos documentos. Considere limitar o número de documentos retornados usando o cenário limit(...). Isso reduz o tamanho do byte serializado dos resultados quando retornados aos clientes pela rede. Nos casos em que o nó Limit é precedido por um nó MajorSort, o mecanismo de consulta pode coalescer os nós Limit e MajorSort e substituir uma materialização e classificação completa na memória por uma ordenação TopN, reduzindo o requisito de memória para a consulta.
Limitar o tamanho do documento de resultados
Considere limitar o tamanho do documento retornado usando um select(...) para retornar apenas os campos necessários ou remove_fields(...) para descartar campos muito grandes. Isso ajuda a reduzir o custo de computação e memória do processamento de resultados intermediários e o tamanho do byte serializado dos resultados quando retornados aos clientes pela rede. Nos casos em que todos os campos referenciados na consulta são cobertos por um índice regular, isso também permite que a consulta seja totalmente coberta pela verificação de índice, sem precisar buscar documentos no armazenamento principal.
Usar índices
Use as instruções a seguir para configurar e otimizar índices.
Identificar se a consulta usa um índice
Para saber se a consulta usa um índice, verifique os nós folha na árvore de execução. Se o nó folha da árvore de execução é um nó TableScan, a consulta não usa um índice e verifica os documentos do armazenamento principal. Se um índice estiver em uso, o nó folha da árvore de execução exibirá o ID e os campos do índice.
Identificar um índice melhor
Um índice é útil para uma consulta se puder reduzir o número de documentos que o mecanismo de consulta precisa buscar no armazenamento principal ou se a ordenação de campos puder atender ao requisito de classificação da consulta.
Se um índice for usado em uma consulta, mas o mecanismo de consulta ainda estiver buscando e descartando muitos documentos, conforme identificado por um nó de verificação que retorna muitos registros seguido por um nó de filtro que retorna poucos registros, isso é um sinal de que o predicado de consulta satisfeito que usa o índice não é seletivo. Para criar um índice mais adequado, consulte Criar índices.
Se um índice for usado em uma consulta, mas o mecanismo de consulta ainda estiver realizando uma reordenação na memória do conjunto de resultados, conforme identificado por um nó MajorSort na árvore de execução da consulta, isso é um sinal de que o índice em uso não pode ser usado para atender ao requisito de classificação da consulta. Para criar um índice mais adequado, consulte a próxima seção.
Criar índices
Siga a documentação de gerenciamento de índices para criar índices. Para garantir que sua consulta possa usar índices, crie índices regulares (sem várias chaves) com campos na seguinte ordem:
- Todos os campos que serão usados em operadores de igualdade. Para maximizar a chance de reutilização em várias consultas, ordene os campos em ordem decrescente de ocorrência nos operadores de igualdade entre as consultas.
- Todos os campos que serão classificados (na mesma ordem).
- Campos que serão usados em operadores de intervalo ou desigualdade em ordem decrescente de seletividade de restrição de consulta.
- Campos que serão retornados como parte de uma consulta no índice: incluir esses campos no índice permite que ele cubra a consulta e evite ter que buscar o documento no armazenamento principal.
Forçar uma verificação de índice ou tabela
Ao consultar o Firestore no modo nativo, ele usa automaticamente os índices que provavelmente tornarão a consulta mais eficiente. Como resultado, você não precisa especificar um índice para suas consultas. No entanto, para consultas essenciais
à sua carga de trabalho, recomendamos usar a opção forceIndex para
um desempenho mais consistente.
Em alguns casos, o Firestore no modo nativo pode escolher um índice que aumenta a latência da consulta. Se você seguiu as etapas de solução de problemas para regressões de desempenho e confirmou que convém tentar um índice diferente para a consulta, especifique o índice usando a opção forceIndex.
É possível usar a opção forceIndex em qualquer etapa de entrada nas operações de pipeline para substituir o plano de consulta padrão do Firestore no modo nativo e especificar um índice a ser usado ou forçar uma verificação de tabela.
Forçar um índice específico
Para forçar a consulta a usar um índice específico, forneça o ID do índice como uma string
para a opção forceIndex. Você pode encontrar o ID do índice no console ou
nas mensagens de erro.
O exemplo a seguir força o planejador a usar o índice com o ID CICAgOi36pgK:
// Force Planner to use Index ID CICAgOi36pgK
db.pipeline()
.collectionGroup({ collectionId: "customers", forceIndex: "CICAgOi36pgK" })
.limit(100)
Confira alguns casos de uso para forçar um índice específico:
- Testar a performance de diferentes índices.
- Garantir que um índice específico e conhecido como ideal seja usado para uma consulta.
- Substituir o otimizador quando a escolha padrão dele não for ideal para uma consulta específica.
Se o índice especificado não for encontrado, a consulta vai falhar.
Forçar uma verificação de tabela
Uma verificação de tabela lê documentos na coleção ou no grupo de coleções sem usar índices secundários. Para forçar uma verificação de tabela, defina forceIndex como primary.
O exemplo a seguir força uma verificação de tabela:
// Force Planner to only do a Full-Table Scan
db.pipeline()
.collectionGroup({ collectionId: "customers", forceIndex: "primary" })
.limit(100)
É possível usar uma verificação de tabela nos seguintes casos:
- Para coleções muito pequenas em que a sobrecarga de índice não é justificada.
- Para consultas que acessam a maioria dos documentos em uma coleção.
- Para depuração e comparações de desempenho.
Usar forceIndex com o Query Explain
Use o Query Explain, principalmente com a opção analyze, para observar os efeitos de forceIndex:
- Verifique se o Firestore no modo nativo usou o índice especificado em
forceIndexconferindo os nós folha da árvore de execução para o ID do índice. - Confirme se um nó
TableScanaparece no plano ao usarforceIndex: "primary". - Compare as métricas de desempenho, como latência, documentos digitalizados e entradas de índice digitalizadas, com e sem
forceIndexpara ajustar a performance da consulta.
Práticas recomendadas para forceIndex
Embora o forceIndex ofereça mais controle sobre a execução de consultas, o otimizador de consultas do Firestore no modo nativo geralmente é eficiente para a maioria dos casos de uso.
Considere as seguintes práticas recomendadas ao usar o forceIndex:
- Use
forceIndexcom moderação. Se você notar um desempenho abaixo do ideal com o plano de consulta padrão, use Query Explain para diagnosticar o problema antes de forçar um índice. - Ao usar
forceIndex, teste suas consultas com volumes de dados realistas para entender o desempenho e as características de custo delas. - Evite usar
forceIndex: "primary"em grandes coleções em ambientes de produção.