Qual Comando Podemos Contar Quantos Documentos Existem Na Nossa Base. - Preenchendo documentos utilizando base de dados. - YouTube
Preenchendo documentos utilizando base de dados. - YouTube

Contar documentos em bases de dados: o que funciona e o que dá problema

O comando para contar documentos depende inteiramente do banco que você está usando. Não existe uma resposta única, e a maioria dos iniciantes pega o caminho errado porque assume que SQL e NoSQL funcionam da mesma forma.

qual comando podemos contar quantos documentos existem na nossa base

Na prática, a resposta curta é: SELECT COUNT(*) FROM sua_tabela; para SQL relacional, db.suaColecao.countDocuments() para MongoDB, e _count ou GET /indice/_count para Elasticsearch. Mas o detalhe importante está nos casos em que esses comandos falham ou retornam resultados enganosos. No PostgreSQL ou MySQL, SELECT COUNT(*) é geralmente rápido porque o otimizador usa estatísticas de amostragem armazenadas pelo autovacuum ou ANALYZE. O valor pode estar desatualizado em bancos com alta taxa de escrita, mas para a grande maioria dos cenários isso é irrelevante. Já SELECT COUNT(1) é exatamente a mesma coisa — só uma convenção mais antiga que persiste por hábito.

No MongoDB, o comando count() foi descontinuado e o driver agora exige countDocuments(). A diferença entre eles não é estética. countDocuments() considera índices e condições de forma precisa, enquanto a versão antiga fazia uma varredura bruta que podia ignorar filtros de forma inconsistente em algumas versões 4.x. Um problema real que eu vi acontecer várias vezes: equipes usando countDocuments() em coleções com bilhões de documentos sem índice adequado. A consulta trava o mongod por minutos ou horas porque ela não consegue usar cobertura de índice e precisa ler toda a coleção. A solução foi criar um campo de shard key bem distribuído ou agregar por um índice existente usando { pipeline: [], hint: "índice_Existente" }. Em alguns casos, manter uma contagem atualizada via trigger ou aplicação é muito mais barato do que rodar a contagem sob demanda.

Em Elasticsearch, a situação é diferente. O campo _count de um mapeamento mostra a quantidade de documentos que passaram pelo índice, mas ele não é atualizado em tempo real durante operações de merge e deleção lógica. Se você precisa de precisão exata para dashboards operacionais, _count pode te dar um número até 10% abaixo do real em índices com muito write throughput. O workaround que eu uso é GET /indice/_count com pretty=true. É mais lento que confiar no campo de mapeamento, mas retorna o valor consistente com a leitura dos shards. Se o cluster estiver em shardings múltiplos, o _count já soma automaticamente todos os shards, então não precisa rodar query por shard manualmente. Isso é útil e evita erro comum de contar apenas o shard primário.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Detalhes técnicos que as documentações nunca destacam

Em SQL Server, o comando sp_spaceused mostra uma contagem aproximada baseada nas páginas de alocação. Ele é instantâneo, mas se a tabela tiver muitos deadlocks ou rollback pendente, o número pode ser completamente errado. A alternativa é query com sys.partitions WHERE object_id = OBJECT_ID('sua_tabela') e partition_number = 1. Isso lê o metadata real sem varredura de dados. No Cassandra, não existe COUNT nativo performático para tabelas grandes. O comando SELECT COUNT(*) vai fazer uma digestão completa em cada partição e provavelmente vai timeout ou sobrecarregar o nó. A solução comum é manter uma contagem em tabela separada usando counters, ou aceitár um aproximado lendo estatísticas do sistema com nodetool tablestats. Eu configurei um job agendado que atualiza uma tabela de metadados a cada hora com base no last_repaired_at, e o dashboard consome esse valor em vez de rodar count no momento da resposta.

Para bancos orientados a colunas como ClickHouse, o comando SELECT count() é extremamente rápido porque o motor armazena contagens parciais em granularity markers. Porém, se você usar SETTINGS optimize_on_insert=1 com INSERTs em pequenos lotes, a contagem pode acumular erros temporários até o merge final. O padrão do motor MergeTree já trata disso automaticamente na maioria das versões recentes, mas vale verificar a versão antes de depender do valor para lógica de negócio.

Quando o comando de contagem não é a resposta certa

Se o objetivo é saber se existe pelo menos um documento, use LIMIT 1 em vez de COUNT. Em PostgreSQL, SELECT 1 FROM tabela LIMIT 1; executa ordens de grandeza mais rápido porque o plano para assim que encontra a primeira linha. A diferença é brutal quando a tabela tem centenas de milhões de registros e o acesso passa por índices largos ou partições. O mesmo vale para MongoDB: em vez de countDocuments({status: 'pendente'}), rode find({status: 'pendente'}).limit(1).length se você só precisa saber se há algum registro pendente. A vantagem é que a query para no primeiro match.

Em sistemas distribuídos como DynamoDB, a contagem consistente custa muito mais do que uma leitura eventual. A AWS recomenda usar consultas de estimativa ou manter métricas lado de fora se a latência for crítica. Eu vi um time perder quase dois dias tentando fazer contagem forte em uma tabela com alta carga de escrita, e o resultado final foi migração para metricas exportadas via CloudWatch com TTL de 5 minutos, o que foi suficiente para o caso de uso deles.

Resumo prático

O comando exato que você deve usar depende do banco, da escala e do que significa "contar" no seu contexto. Use COUNT(*) em SQL relacional para precisão. Prefira countDocuments() no MongoDB, evite count() legado. No Elasticsearch, _count é bom para aproximação rápida e GET /_count para precisão. Em sistemas distribuídos, considere manter a contagem como sidecar em vez de calcular sob demanda. E sempre verifique se realmente precisa da contagem exata antes de rodar uma query que pode derrubar a fila.