Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

*_Charles Potter_*

Count

Recommended Posts

Bom Dia gente

 

Qual a melhor forma de contar a quantidade de registro em uma consulta?

Estou utilizando o Select Count(Codigo) as QtdTotal From .....

 

Porem em uma tabela com cerca de 500 milhões de registros o tempo de consulta é muito alto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode citar características de configuração do ambiente? Memória disponível, processador e sistema de disco? Windows ou Linux? Roda apenas o MySQL? Enquanto você faz esse SELECT, outros processos continuam fazendo INSERT na tabela?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A tabela TEM cerca de 500 milhões de registros.

Quantos CodigoProduto distintos ?

Isto é , qual a média de registros por CodigoProduto ?

 

Se a média for muito alta e leitura via índice fica custosa.

Isto pode fazer com que o BD decida pelo Full Scan.

É um palpite.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Refinar o índice, incluindo mais campos na busca.

 

Exemplo

 

codStatus (1-baixado,2-em aberto,3-cancelado)

 

Select
count(Codigo) as QtdTotal
From
LogEstoque
Where
CodigoProduto = '184934' 
and
codStaus = 2

 

Ou um campo de data, analisando bem pois datas em índices pode ser fator complicador.

 

 

Mas depende claro das regras de negócio

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que você esta tendo problemas com LOCK na tabela.

De uma olhada nas informações sobre LOCK do sistema:

show status like 'Table%';

 

Se o valor na variável Table_locks_waited estiver muito alto, pode ser uma razão.

 

O que pode funcionar neste caso é criar uma tabela de logs histórica. Vou dar um exemplo:

- LogEstoque, apenas o mês atual;

- LogEstoque_history, todos os meses anteriores;

 

Desta forma você minimiza o quantidade de registros no LogEstoque, fazendo com que o sistema de banco de dados trabalhe menos para fazer o COUNT, a tabela de Log histórica vai basicamente ser utilizada para consultas, sem concorrer com outros processos de insert.

 

Como usar?

select (Select count(Codigo) From LogEstoque Where CodigoProduto = '184934') + (Select count(Codigo) From
LogEstoque_history Where CodigoProduto = '184934') as QtdTotal

 

Isto é um palpite.

 

Tente também os comandos ANALYZE TABLE e OPTIMIZE TABLE.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Prog

 

O comando SQL_CALC_FOUND_ROWS é mais rápido que o count()?

 

Não. Teoricamente deve levar o mesmo tempo, dependendo do caso ser até mais lento.

 

O SQL_CALC_FOUND_ROWS leva vantagem quando você precisar mostrar os dados do resultado e também mostrar a quantidade de registros retornados, com apenas processamento você obter as duas informações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.