[firebase-br] Desempenho com COUNT

Eduardo Bahiense eduardo em icontroller.com.br
Ter Jan 6 23:58:39 -03 2009


Oi Marcelo

Nada de sobrenatural nisso. Na verdade, SELECT COUNT(1) é o mesmo que 
SELECT COUNT(*). Assim, para cada uma das 1300 linhas, ele percorre 1300 
linhas, dando 1300^2, que são 1.690.000 leituras na tabela.

Não vejo objetivo prático nessa instrução, aliando agregamento com 
subselect. Você conseguiria o mesmo resultado de duas formas:

SELECT ID_CLIENTE, NOME_CLIENTE, COUNT(*) AS NUMROWS
FROM CLIENTES
GROUP BY ID_CLIENTE, NOME_CLIENT

ou

SELECT DISTINCT ID_CLIENTE, NOME_CLIENTE,
(SELECT COUNT(*) FROM CLIENTES WHERE ID_CLIENTE=A.ID_CLIENTE) AS NUMROWS
FROM CLIENTES A

ou ainda da sua forma original colocando um where no subselect.

A performance das duas primeiras deve ser semelhante, pois resultará, 
praticamente, o mesmo número de leituras. A terceira opção, não sei como 
se comportaria, mas deve resultar pelo menos o dobro de leituras das 
anteriores, pois ele vai ter que resolver um agrupamento e um subselect, 
quando um ou outro bastaria.

Observe ainda, que, ao que parece, ID_CLIENTE é chave primária nessa 
tabela e só haverá um nome relacionado a cada registro, tornando tudo 
isso acima sem sentido, pois count() retornará sempre 1. Parece meio 
óbvio, mas será que o que você quer não é um "select count(*) from 
clientes?", olu tudo isso é só um teste?


Eduardo

Marcelo Geyer escreveu:
> Boa tarde,
> 
> A pergunta é simples mas fiquei apavorado com a performance. Tenho um
> cadastro com 1300 registros.
> Ao fazer o SQL abaixo (exemplo) com subselect:
> 
> SELECT ID_CLIENTE, NOME_CLIENTE,
> (SELECT COUNT( 1 ) FROM CLIENTES) AS NUMROWS
> FROM CLIENTES
> GROUP BY ID_CLIENTE, NOME_CLIENTE
> 
> Este SQL leva de 3 a 4 segundos para me retornar as informações. Se faço
> independente, leva menos de 1 segundo. Como eu poderia otimizar SQL com este
> tipo de estrutura? Imagino que o culpado aqui é o subselect que a cada
> registro é recalculado.
> A pergunta é simples mas bem oportuna, vejam como um subselect com count
> pode comprometer a aplicação.
> 
> Att.
> 
> Marcelo E. Geyer.
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> 





Mais detalhes sobre a lista de discussão lista