[firebase-br] Desempenho com COUNT

Marcelo Geyer estanisgeyer em gmail.com
Qua Jan 7 09:47:31 -03 2009


Pelo visto, para melhorar o desempenho, vou ter que fazer dois SQL, um para
contar a quantidade de registros e outro para retornar os registros que
quero, na mesta transação. Ou, como o Kleber Caneva colocou, criar uma
procedure.

2009/1/7 Kleber Caneva <kdcc em terra.com.br>

> Nesses exemplos ele vai retorar 1 pra todos os registros, e não o total que
> registros como o Marcelo está querendo.
>
> []´s
>
> Kléber Caneva
>
> ----- Original Message -----
> From: "Eduardo Bahiense" <eduardo em icontroller.com.br>
> To: <lista em firebase.com.br>
> Sent: Tuesday, January 06, 2009 10:58 PM
> Subject: Re: [firebase-br] Desempenho com COUNT
>
>
> 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
>
> E-mail verificado pelo Terra Anti-Spam.
> Para classificar esta mensagem como spam ou não spam, visite
>
> http://mail.terra.com.br/cgi-bin/reportspam.cgi?+_d=SCY0NDU0NzM0I3Blcm0hdGVycmEmMSwxMjMxMjkzNTU5LjkzNzUxMC4xNjQ4My5wcmVzdG9uLnRlcnJhLmNvbSw2Mjg2
> Verifique periodicamente a pasta Spam para garantir que apenas mensagens
> indesejadas sejam classificadas como Spam.
>
>
>
> ______________________________________________
> 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