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