Um banco PostgreSQL rápido é um banco cujos dados consultados com frequência cabem na memória. Todo o dimensionamento parte daí: o volume do banco, a parte que realmente trabalha, o número de conexões e, depois, o disco e a margem dele. Este guia traz o método, as configurações iniciais para 4, 8 e 16 GB de memória e as consultas que medem um banco existente.
shared_buffers em 25% da memória, effective_cache_size em 75%, random_page_cost = 1.1 em SSD NVMe.pg_dump, fora do servidor, e restaure com regularidade para comprovar que funciona.A memória de um servidor de banco de dados serve primeiro de cache: uma página lida da memória é servida muito mais rápido que uma página lida do disco, mesmo NVMe. A pergunta, então, não é só “quanto pesa o banco?”, mas “que parte dele é lida com frequência?”. Um banco de 50 GB em que só os últimos doze meses são consultados talvez trabalhe com 8 GB.
Em um banco existente, duas consultas dão o volume total e as maiores tabelas, índices incluídos:
SELECT pg_size_pretty(pg_database_size(current_database()));
SELECT relname AS nome,
pg_size_pretty(pg_total_relation_size(relid)) AS tamanho_com_indices
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;
Para um banco ainda por criar, estime tabela por tabela: número de linhas esperadas em um ano × tamanho médio de uma linha e, depois, acrescente os índices, que costumam pesar de 30 a 100% dos dados. Exemplo: 2 milhões de linhas por mês, de 500 bytes cada, dão 12 GB de dados em um ano, e 18 a 24 GB com os índices.
O PostgreSQL guarda as páginas lidas em dois níveis: o próprio cache (shared_buffers) e o cache de arquivos do sistema. A documentação do PostgreSQL recomenda partir de 25% da memória para shared_buffers em um servidor dedicado, e observa que, acima de 40%, o ganho se torna raro: o restante beneficia o cache do sistema e as ordenações.
| Parâmetro | 4 GB | 8 GB | 16 GB | Função |
|---|---|---|---|---|
shared_buffers | 1 GB | 2 GB | 4 GB | O cache próprio do PostgreSQL |
effective_cache_size | 3 GB | 6 GB | 12 GB | O cache total estimado, que orienta a escolha dos planos de consulta |
work_mem | 8 MB | 16 MB | 32 MB | A memória de cada ordenação ou hash, por conexão: a multiplicar pelas consultas simultâneas |
maintenance_work_mem | 256 MB | 512 MB | 1 GB | A criação dos índices e o VACUUM |
random_page_cost | 1.1 | 1.1 | 1.1 | O custo estimado de uma leitura aleatória: 4 por padrão, bem acima do custo real em SSD NVMe |
Esses valores supõem um banco sozinho no servidor. Se a aplicação roda ao lado, desconte primeiro a memória dela (processos, cache, build) e aplique as porcentagens ao restante: um servidor de 8 GB que roda uma aplicação de 3 GB se ajusta como um banco de 5 GB.
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1
shared_buffers só entra em vigor quando o PostgreSQL reinicia; os outros parâmetros são recarregados sem interrupção, com SELECT pg_reload_conf();.
Para saber se a memória basta, leia a taxa de leitura em cache. Em uma aplicação de gestão ou em um site, ela passa de 99%:
SELECT round(100.0 * blks_hit / nullif(blks_hit + blks_read, 0), 2) AS taxa_cache
FROM pg_stat_database
WHERE datname = current_database();
O PostgreSQL abre um processo por conexão e aceita 100 por padrão (max_connections). Cada processo ocupa alguns megabytes em repouso, mais quando ordena ou faz hash de dados (work_mem, às vezes várias vezes na mesma consulta). Aumentar max_connections para 500 para acompanhar uma aplicação que abre conexões demais é expor o servidor a ficar sem memória no primeiro pico.
A boa resposta é um pool de conexões: o PgBouncer, no modo transaction, faz algumas dezenas de conexões efetivas com o banco atenderem centenas de conexões da aplicação. Os frameworks também têm o próprio pool (SQLAlchemy, Prisma, HikariCP): ajuste o tamanho dele pelo número de vCPU do servidor do banco, e não pelo número de usuários.
O disco de um servidor PostgreSQL guarda mais do que as tabelas:
max_wal_size), mais durante uma importação em massa, e mais ainda se o arquivamento do log atrasar.work_mem.VACUUM FULL e a reconstrução de um índice gravam uma cópia completa antes de liberar a antiga.A regra: o volume em um ano, mais pelo menos 30% de margem. Não é conforto: quando o disco que guarda o log de transações enche, o PostgreSQL se desliga para proteger os dados. Monitore a ocupação e amplie antes de 80%.
Do lado do desempenho, cada commit espera a gravação do log em disco: a latência do armazenamento define a vazão de escrita. É aí que um SSD NVMe faz a diferença, muito mais do que nas leituras, que a memória já atende.
Uma consulta PostgreSQL é executada em um único núcleo, exceto as grandes leituras que o motor paraleliza. O número de vCPU define, portanto, quantas consultas pesadas são processadas ao mesmo tempo: 2 vCPU bastam para uma aplicação de gestão no lançamento, 4 a 8 atendem bancos muito solicitados e relatórios pesados.
Antes de acrescentar vCPU, procure as consultas que os consomem. A extensão pg_stat_statements as classifica por tempo total:
shared_preload_libraries = 'pg_stat_statements'
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
SELECT calls, round(total_exec_time) AS ms_total,
round(mean_exec_time::numeric, 1) AS ms_medio, query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
No lançamento, o banco no mesmo servidor da aplicação é a escolha certa: nenhuma latência de rede entre os dois, uma conexão por socket Unix, um único servidor para fazer backup e monitorar. Separa-se quando os dois disputam os recursos: um build ou um pico de tráfego que esvazia o cache do banco, um banco que precisa de toda a memória para os dados, ou exigências de backup diferentes.
listen_addresses = 'localhost' enquanto apenas a aplicação do servidor se conectar. Se outro servidor precisar acessar o banco, abra a porta 5432 somente para o endereço dele, no firewall e no pg_hba.conf.scram-sha-256 no pg_hba.conf, um papel (role) por aplicação, sem privilégios de superusuário.pg_dump, copiado para fora do servidor.pg_dump -Fc -d minha_base -f minha_base-$(date +%F).dump
createdb minha_base_teste
pg_restore -d minha_base_teste minha_base-2026-10-29.dump
O VPS Pro roda em processadores Intel Xeon, memória ECC que corrige erros em tempo real e SSD NVMe espelhados, com cada bloco de dados verificado por checksum e um backup criptografado toda noite, fora da máquina. A Assistência integral está incluída: quando seu banco fica lento, analisamos as consultas lentas e os índices e indicamos os ajustes que deixam sua aplicação rápida de novo.
O suficiente para que os dados consultados com frequência caibam na memória. Para uma aplicação de gestão no lançamento, 4 GB bastam, banco e aplicação incluídos. Depois, meça a taxa de leitura em cache: enquanto ela ficar acima de 99%, a memória é suficiente.
25% da memória em um servidor dedicado ao banco, como recomenda a documentação do PostgreSQL: 1 GB em 4 GB, 2 GB em 8 GB, 4 GB em 16 GB. Acima de 40%, o ganho se torna raro, e o cache do sistema faz o resto.
O PostgreSQL aceita 100 por padrão, e cada conexão é um processo que consome memória. Em vez de aumentar esse limite, coloque um pool de conexões como o PgBouncer na frente do banco: algumas dezenas de conexões efetivas com o banco passam a atender centenas de conexões da aplicação.
Não no lançamento: no mesmo servidor, o banco responde sem latência de rede e o conjunto entra em um único backup. Separa-se quando um atrapalha o outro, por exemplo quando um build ou um pico de tráfego esvazia o cache do banco.
Simafri
Vamos falar de seu site
Conte para a gente sobre seu projeto em poucas palavras: responderemos rapidamente.
Obrigado! O seu pedido foi enviado. Responderemos em breve.
Prefere o e-mail? Escreva para a gente em support@simafri.com.