Estou usando o Postgres com a seguinte consulta:
select count(*) from image;
A chave primária nesta tabela não é incrementada; é um número de série exclusivo para as imagens armazenadas na tabela. Nosso aplicativo geralmente tenta ingerir imagens que já foram gravadas no banco de dados, portanto, a chave primária/número de série garante que elas sejam gravadas apenas uma vez.
Agora estamos nos perguntando se deveríamos ter optado por uma chave primária incrementada. Temos 1.259.369 imagens no banco de dados e leva cerca de 7 minutos para a execução da consulta de contagem.
Nosso aplicativo nunca excluirá imagens desta tabela - portanto, uma chave primária incrementada nos permitiria verificar o valor do último ID que seria igual ao número de linhas na tabela.
Geralmente, se você não precisa de uma contagem exata , existe uma maneira muito mais rápida:
Na verdade, em um banco de dados com acesso de gravação simultâneo, cada contagem é uma estimativa, porque o número pode estar desatualizado no instante em que você o obtém.
Mas, como @a_horse comentou , há algo errado no seu banco de dados. Contar um milhão não deve levar mais do que alguns segundos no pior dos casos.
O fato de você
app will never delete images from this table
tornar isso ainda mais suspeito, porque não deve haver muitas linhas mortas. (Ou você está atualizando muito ?) Uma grande quantidade de tuplas mortas pode atrasá-lo - e exigir arquivosVACUUM
. Normalmente, o autovacuum cuida disso. Você habilitou? (É o padrão no Postgres moderno.)Verifique se há tuplas mortas:
Todos os conselhos usuais para otimização de desempenho se aplicam.
Retirado do meu blog:
Usando pg_stat_user_tables, você pode encontrar a contagem de linhas de uma tabela PostgreSQL: