[firebase-br] Desempenho com COUNT

Marcelo Geyer estanisgeyer em gmail.com
Qua Jan 7 09:21:37 -03 2009


Olá amigos, obrigado pelas respostas

O SQL que postei de fato é um exemplo, pois não apliquei nenhuma condição
para filtrar os dados.

Seguindo o raciocínio do exemplo, o que deve ser retornado é o ID_CLIENTE
(chave primária), Nome do cliente e aproveitar o SQL e me retornar também a
quantidade de registros. Muitos aqui me deram exemplos de totais de
registros agrupados por id/cliente (retornando no meu exemplo o valor "1" -
Claro, nenhum registro se repete), mas não o total de registros (um simples
"SELECT COUNT(ID_CLIENTE) FROM CLIENTE WHERE..." resolveria. Mas como
otimizar para montar em apenas um SQL?

Abraços,

Marcelo E. Geyer

2009/1/6 Eduardo Bahiense <eduardo em icontroller.com.br>

> 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
>>
>>
>
> ______________________________________________
> 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