Em 18 de setembro de 2011 15:33, Richard Mitsuo Fuzishawa
<rmfuzish...@gmail.com> escreveu:
> Boa tarde a todos,
>
> Sou novo no Forum, espero apreender bastante com os senhores....
>
> Tenho um banco de dados postgresql com mais ou menos 2.400.000 registros...
>
> Meu desenvolvedor necessita realizar um select count(*) nesta tabela para
> poder paginar a aplicação dele...
>
> Quando a aplicação inicia, o "select count(*)" para esta tabela demora mais
> ou menos 10 segundos...   Depois, este mesmo select passa a "ser mais
> rápido", mais ou menos 3 segundos...   Alguém tem idéia do que pode ser ?
>
> Fiz um teste interativo, ou seja, fiz o 'select count(*)' pelo psql ...
> Ocorreu a mesma coisa, ou seja, o primeiro select demorou 'muito' e os
> 'selects count(*)' posteriores foram mais rápidos ...

O que ocorre é que como o PostgreSQL utilza MVCC [1], quando voce faz
um count(*), por exemplo, ele precisa "saber" quais registros estão
visíveis para sua transação e por isso ele escaneia esta tabela. Isso
porque cada transação tem uma visão própria de uma mesma tabela, já
que em uma transação você pode ter removido ou acrescentado registros
enquanto que em outra você apenas fez consultas, logo o count(*) vai
retornar diferentes valores para cada transação, até que a primeira
comite, por exemplo.

Uma alternativa, desde que você não precise do valor exato mas sim de
um *aproximado*, é utilizar o valor to campo 'reltuples' ta tabela de
catalogo chamada 'pg_class' [2]. Como ele é atualizado quando é rodado
um VACUUM, um ANALYZE ou alguns comandos DDL, como CREATE INDEX, por
exemplo,  pode ser usado como uma *estimativa* to total de registros
da tabela em questão.

[1] http://www.postgresql.org/docs/current/interactive/mvcc-intro.html
[2] http://www.postgresql.org/docs/current/static/catalog-pg-class.html

[]s
Dickson S. Guedes
mail/xmpp: gue...@guedesoft.net - skype: guediz
http://guedesoft.net - http://www.postgresql.org.br
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a