[firebase-br] Desempenho com COUNT

Kleber Caneva kdcc em terra.com.br
Qua Jan 7 10:25:39 -03 2009


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.






Mais detalhes sobre a lista de discussão lista