[firebase-br] Desempenho com COUNT

Adriano Ferreira aerreira68 em gmail.com
Qua Jan 7 09:29:47 -03 2009


No Oracle gerei o seu primeiro sql em uma tabela com 792 registros e o
resultado é obtido em 94 msecs.Mas pergunto: pra que repetir a quantidade
total de clientes ao lado de cada cliente?  Não entendi o objetivo disso.

-- 
Adriano Ferreira


2009/1/7 Marcelo Geyer <estanisgeyer em gmail.com>

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