Eu tenho um programa Java/JDBC que pega um arquivo de amostra e importa os dados para o banco de dados, fragmentando-os em várias relações. O programa faz isso várias vezes para várias representações diferentes, uma das quais usa objetos grandes. Posso compartilhar mais detalhes dessas representações, mas elas são muito longas e não são relevantes para essa questão, pois estou procurando algo genérico.
Gostaria de comparar os tamanhos dessas diferentes representações examinando o tamanho do banco de dados após cada importação. O banco de dados está em uma instância do servidor Windows local PostgreSQL 9.4, sem outros usuários e com configuração padrão. Sua única finalidade é realizar este teste.
Meu plano inicial era o seguinte:
for each representation {
call VACUUM ANALYZE
record old DB size with SELECT pg_tablespace_size('pg_default');
import data into database
call VACUUM ANALYZE
record new DB size with SELECT pg_tablespace_size('pg_default');
store storage cost as new DB size - old DB size
}
Obviamente, há limitações para essa abordagem, mas minha expectativa é que, para arquivos grandes (~ 100 MB), os custos de armazenamento relatados sejam aproximações razoáveis. Observe que utilizo pg_tablespace_size
de forma a incluir a contribuição de dados fora do esquema principal, como objetos grandes (in pg_catalog.pg_largeobject
e pg_catalog.pg_largeobject_metadata
).
Eu estou querendo saber se esta é uma abordagem correta e se existe uma abordagem melhor. Não tenho certeza se VACUUM ANALYZE
atualiza corretamente as estatísticas usadas por pg_tablespace_size
, mesmo que seja chamado na mesma sessão. Também seria melhor se eu pudesse evitar chamar VACUUM ANALYZE
, pois isso requer conexão como superusuário para executar as pg_catalog
relações.
Alguma ideia?
Basta ligar
pg_database_size(dbname)
para saber o tamanho do banco de dados.VACUUM
(sem aFULL
cláusula) não libera nenhum espaço, apenas o marca como reutilizável e, portanto, não altera o tamanho do banco de dados (exceto em um caso de limite raro, consulte Routine Vacuuming ).ANALYZE
faz amostragem estatística e seria útil se você precisasse das contagens de linhas, mas para o tamanho global do banco de dados, não é necessário.