On Sun, Mar 9, 2008 at 5:19 PM, Ribamar Sousa <[EMAIL PROTECTED]> wrote:
> Em 09/03/08, Roberto Mello<[EMAIL PROTECTED]> escreveu:
>
> > Nao sei se voce entendeu que se tu fazes um count() na tabela inteira,
>  >  tu NAO ESTAS USANDO INDICE NENHUM.
>
>  Não entendi, pois sinceramente não sabia disso.

Isso é um ponto de confusão freqüente. Os aficionados do MySQL
freqüentemente fazem "benchmarks" em que comparam a performance do
COUNT() (sem nenhuma condição) do MySQL com o do PostgreSQL como
"prova" que o MySQL é "muito mais rápido".

Ora, quando usando MySQL com tabelas MyISAM o MySQL faz um cache do
número de registros, então a operação COUNT() sem condições retorna
instantâneamente. MyISAM não tem que se preocupar com transações nem
nada.

No PostgreSQL se você fizer uma COUNT(), o valor tem que ser
condizente com a *transação* onde a consulta foi feita. Ou seja, para
uma mesa tabela, os valores de COUNT() vão ser diferentes conforme a
transação. Não se há outras razões técnicas por que não fazer um cache
similar ao do MySQL para os casos onde se quisesse o valor de tuplas
"committed", mas confio no PGDG (que é muito competente) que se não
foi feito é por que há boas razões para tal.

Outro erro freqüente em relação à índices é que botam um índice numa
coluna varchar, aí fazem consultas usando lower(colunavarchar). O
índice não será usado por que o índice está agindo sobre os valores
normais. Para que uma consulta com lower() use um índice, tem que se
criar um outro índice funcional, ou seja um índice em
lower(minhacolunavarchar).

Roberto
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a