Ramos da InformáticaBanco de DadosPostgreSQL Tuning: Como Otimizar a Performance

PostgreSQL Tuning: Como Otimizar a Performance

Descubra as melhores práticas para otimizar o desempenho do PostgreSQL. Aprenda a ajustar parâmetros essenciais como conexões simultâneas, consultas paralelas e cache para melhorar a performance do banco de dados e garantir uma aplicação eficiente e rápida.

-

Melhore a performance do seu PostgreSQL. Aprenda a configurar shared_buffers, work_mem, checkpoint_segments e como usar o VACUUM para eliminar o inchaço do banco.

O PostgreSQL é um dos bancos de dados relacionais mais utilizados por desenvolvedores e empresas em todo o mundo, conhecido pela sua robustez, flexibilidade e eficiência. No entanto, para garantir que ele funcione em sua máxima capacidade, é essencial ajustar certos parâmetros e configurar o ambiente de forma adequada. Neste artigo, vamos abordar algumas configurações e comandos essenciais que podem ajudar você a otimizar o desempenho do PostgreSQL, garantindo melhor resposta e uso eficiente dos recursos do servidor.

Vamos utilizar bastante o comando ALTER SYSTEM no PostgreSQL, pois este permite a alteração de parâmetros de configuração diretamente no banco de dados, sem a necessidade de editar o arquivo postgresql.conf manualmente. Isso facilita o ajuste de variáveis importantes para melhorar a performance, segurança e estabilidade do sistema. Este artigo detalha o uso do comando ALTER SYSTEM, explora os principais parâmetros que você pode configurar e fornece dicas para obter o melhor desempenho com ajustes otimizados.

O Que é o Comando ALTER SYSTEM?

O comando ALTER SYSTEM permite modificar parâmetros de configuração globalmente, aplicando mudanças que impactam o servidor PostgreSQL como um todo. Após a execução do comando, as configurações alteradas ficam salvas no arquivo postgresql.auto.conf, que é gerado automaticamente e tem prioridade sobre o arquivo postgresql.conf. Esse comando é muito útil para ambientes em que ajustes frequentes de configuração são necessários e para otimizar operações sem intervenções manuais no servidor.

Dica de Leitura: Se você está buscando otimizar o desempenho do seu banco de dados, especialmente com o PostgreSQL, é importante considerar como outras tecnologias podem integrar-se para melhorar a eficiência. Uma abordagem interessante é o uso de Redis em bancos relacionais, o que pode significativamente melhorar a performance das suas aplicações. Leia mais sobre como isso funciona em Performance com Redis em Bancos Relacionais

Sintaxe Básica do ALTER SYSTEM

A sintaxe básica do ALTER SYSTEM é:

ALTER SYSTEM SET parameter_name = value;

Para aplicar a alteração, é necessário recarregar o serviço PostgreSQL. Você pode fazer isso com o comando SQL:

SELECT pg_reload_conf();

Esse comando permite que o PostgreSQL carregue as novas configurações sem necessidade de reiniciar o serviço, economizando tempo e reduzindo o tempo de inatividade.

Mas o objetivo deste tutorial é a otimização de consultas no PostgreSQL e, para isso, vamos explicar de forma direta os comandos SQL para otimização, utilizando o ALTER SYSTEM.

1. Controle de Conexões no PostgreSQL

Uma das primeiras configurações a se considerar ao otimizar o PostgreSQL é o controle de conexões simultâneas. Por padrão, o PostgreSQL aceita um número limitado de conexões, mas essa quantidade pode ser ajustada para atender à demanda da aplicação.

Para visualizar o limite atual de conexões, você pode usar o comando:

show max_connections;

Esse comando retorna o valor configurado de max_connections, que representa o número máximo de conexões que o banco de dados aceita ao mesmo tempo.

Para alterar esse limite, utilize:

alter system set max_connections = 300;

Configurar um valor adequado para max_connections é essencial, pois muitas conexões simultâneas podem consumir uma quantidade significativa de memória e afetar o desempenho do servidor. Idealmente, o valor deve ser configurado conforme a quantidade de RAM disponível e a carga de trabalho da aplicação.

Dica Extra: Conexões Inativas

Transações inativas ocupam recursos que poderiam estar disponíveis para outras operações. Para configurar um tempo limite para sessões inativas, use:

alter system set idle_in_transaction_session_timeout = '1min';

2. Ajustes para Consultas Paralelas

A capacidade de executar consultas em paralelo é um dos recursos mais poderosos do PostgreSQL para acelerar a execução de tarefas pesadas. Os comandos abaixo ajudam a controlar o número de processos paralelos e a memória disponível para cada consulta.

a) Controlando o Número de Trabalhadores Paralelos

A configuração max_parallel_workers_per_gather define quantos processos podem ser alocados para uma única consulta paralela. Um valor muito alto pode sobrecarregar a CPU, então é importante testar diferentes valores.

alter system set max_parallel_workers_per_gather = 4;

Além disso, você pode definir o número total de processos paralelos disponíveis:

alter system set max_worker_processes = 8;

Esses ajustes ajudam o PostgreSQL a utilizar melhor a CPU em consultas mais complexas, como as que envolvem grandes volumes de dados ou operações como JOIN.

b) Limitando o Uso de Memória por Operação

Para operações que exigem uso intensivo de memória, como ordenações e junções, o PostgreSQL usa o parâmetro work_mem. O valor padrão pode ser muito baixo em alguns casos, especialmente quando há muita memória disponível no servidor:

alter system set work_mem = '16MB';

3. Cache e Armazenamento Eficiente de Dados

Para otimizar o armazenamento e uso de cache, o PostgreSQL oferece várias configurações que controlam o uso da memória.

a) shared_buffers

O parâmetro shared_buffers define a quantidade de memória reservada para o cache de dados do PostgreSQL. Em um servidor dedicado, recomenda-se configurar esse valor para aproximadamente 25% a 40% da memória RAM disponível:

alter system set shared_buffers = '1GB';

Esse ajuste reduz a necessidade de leitura de disco, pois os dados acessados recentemente permanecem em memória, aumentando a velocidade das operações.

b) effective_cache_size

O parâmetro effective_cache_size informa ao otimizador do PostgreSQL a quantidade de memória total que o sistema operacional usa para o cache. Embora esse parâmetro não reserve diretamente a memória, ele ajuda o otimizador a calcular a eficiência de planos de consulta. Um bom valor é geralmente entre 50% e 75% da memória do sistema:

alter system set effective_cache_size = '4GB';

c) Reduzindo o Custo de Leitura Aleatória

Em sistemas com armazenamento SSD, as leituras aleatórias são rápidas, mas o PostgreSQL, por padrão, assume um custo mais alto para esse tipo de operação. Ajustar o random_page_cost ajuda o otimizador a escolher planos de consulta mais rápidos:

alter system set random_page_cost = 1.1;

Isso faz com que o banco de dados prefira leituras aleatórias, aproveitando melhor a velocidade dos SSDs, o que é vantajoso para sistemas que dependem desse tipo de armazenamento.

4. Configuração de Eventos e Monitoração de Desempenho

Manter uma boa monitoração é essencial para identificar gargalos de desempenho e ajustes necessários.

a) Ajuste do Tempo de Sessão

Para analisar quanto tempo uma sessão permanece ativa, você pode configurar parâmetros de timeout para sessões inativas ou limites de execução de consultas:

alter system set statement_timeout = '30s';

Esse ajuste define um limite de tempo para a execução de cada consulta. Se uma consulta exceder esse limite, ela será encerrada automaticamente, evitando que consultas lentas sobrecarreguem o servidor.

b) Log de Consultas Lentas

Configurar o log de consultas lentas é uma prática recomendada para detectar queries que precisam de otimização:

alter system set log_min_duration_statement = '500ms';

Esse parâmetro grava no log qualquer consulta que leve mais de 500 milissegundos para ser executada. Com isso, é possível identificar e otimizar queries lentas.

5. Controle de Parâmetros de Custo e Processamento

a) cpu_tuple_cost

O parâmetro cpu_tuple_cost define o custo de processamento de cada tupla (linha) no PostgreSQL. Esse custo influencia o otimizador na escolha dos planos de consulta, principalmente em tabelas grandes:

alter system set cpu_tuple_cost = 0.01;

Reduzir o valor ajuda o otimizador a selecionar planos mais eficientes em ambientes de alta performance.

b) cpu_index_tuple_cost

Se seu banco de dados usa intensamente índices, esse parâmetro informa ao otimizador o custo estimado de processamento para cada linha de índice:

alter system set cpu_index_tuple_cost = 0.005;

Conclusão

Otimizar o PostgreSQL pode ser um processo contínuo, e as configurações ideais variam dependendo da infraestrutura, volume de dados e carga de trabalho específica da aplicação. Ajustes como o aumento de conexões simultâneas, otimização de consultas paralelas e ajuste de parâmetros de cache são fundamentais para garantir um banco de dados rápido e eficiente.

Além dos comandos apresentados, lembre-se de monitorar regularmente o desempenho do banco de dados e registrar consultas lentas. Ferramentas de monitoração, como o pg_stat_activity, ajudam a identificar gargalos, enquanto ajustes específicos permitem responder às necessidades da aplicação de forma eficiente.

Com esses ajustes e uma monitoração constante, você terá um PostgreSQL otimizado, capaz de oferecer suporte a aplicativos de alta performance, garantindo uma resposta rápida e uso eficiente de recursos do servidor.

LEIA TAMBÉM: Os Principais Comandos SQL que Todo Desenvolvedor Deve Conhecer

VAI GOSTAR: O que é normalização de banco de dados? – Descubra tudo sobre a normalização de banco de dados, incluindo as explicações detalhadas da 5NF e 2NF com exemplos práticos. Aprenda como melhorar a organização e a eficiência dos seus dados e otimize seus sistemas de forma profissional.

Perguntas Frequentes (FAQ): Otimização de PostgreSQL

Qual é o valor ideal para o shared_buffers no PostgreSQL?

Diferente de outros bancos, o PostgreSQL depende muito do cache do sistema operacional. Por isso, a recomendação padrão para servidores dedicados é configurar o shared_buffers com cerca de 25% da memória RAM total do sistema. Valores acima de 40% raramente trazem benefícios e podem até prejudicar a performance devido à redundância de cache com o Kernel do Linux/Windows.

Por que o comando VACUUM é tão importante?

O PostgreSQL utiliza uma arquitetura chamada MVCC (Multiversion Concurrency Control). Quando você faz um UPDATE ou DELETE, a linha antiga não é apagada fisicamente, ela é apenas marcada como “morta” (bloat). O VACUUM serve para limpar esses registros mortos e reutilizar o espaço em disco. Sem ele, seu banco crescerá indefinidamente e as consultas ficarão extremamente lentas.

O PostgreSQL é realmente mais rápido que o MySQL?

Não existe uma resposta única, mas há uma diferença de foco. O MySQL tende a ser mais rápido para operações de leitura simples e sites de alto tráfego com pouca complexidade (como blogs e e-commerces). O PostgreSQL brilha em consultas complexas, grandes volumes de dados e análise (BI), além de ser muito mais rigoroso com a integridade dos dados e oferecer recursos avançados como o Row Level Security e suporte nativo a JSONB de alta performance.

Como o work_mem afeta minhas consultas SQL?

O work_mem define quanta memória cada operação individual de ordenação (SORT) ou junção (JOIN) pode usar antes de começar a escrever em arquivos temporários no disco. Se você tem queries complexas e o work_mem está muito baixo, o Postgres usará o disco, o que é mil vezes mais lento que a RAM. Mas cuidado: este valor é por operação, então se você tiver 100 conexões fazendo 3 joins cada, o consumo de RAM pode explodir se o valor for muito alto.

Ramos Souza J
Ramos Souza Jhttps://ramosdainformatica.com.br/sobre/
Ramos de Souza Janones é Senior FullStack Engineer na ReDraw, com mais de 26 anos de trajetória no desenvolvimento de software. Especialista em arquiteturas escaláveis com React e TypeScript, sua jornada percorreu desde o Clipper até o ecossistema moderno de IA e microsserviços. Com passagens por grandes players como Wipro (Bradesco PIX), Ramos também atuou na Fiocruz em um projeto estratégico para o Ministério da Saúde, desenvolvendo o sistema de acompanhamento da saúde da mulher para a prevenção do câncer de colo, do monitoramento na infância à maturidade. Unindo visão técnica profunda, liderança e foco em performance, ele é o criador do portal Ramos da Informática, onde compartilha conhecimento sobre desenvolvimento Full Stack e as tendências de IA aplicadas à engenharia de software.

Mais recentes

Como aprender a programar, um guia definitivo

Última atualização em 23/04/2026. Guia completo sobre: Como aprender a programar. Espero que este “guia” ou “manifesto”, como prefiro chamar, seja...

Stream Deck para Desenvolvedores: o Console de Comando do Futuro

Esqueça os streamers. Descubra como o Stream Deck se tornou o hardware essencial para Engenheiros de IA e Full...

Como Usar o Skills in Chrome no Brasil: Tutorial Completo de IA

A inteligência artificial já faz parte do nosso fluxo de trabalho, mas ter que reescrever os mesmos prompts repetidamente...

Context Engineering: Como Arquitetar Dados para LLMs e RAG

Na edição desta newsletter intitulada “Engenharia de Prompt: Não é só mais uma buzzword“: https://www.linkedin.com/pulse/engenharia-de-prompt-n%C3%A3o-%C3%A9-s%C3%B3-mais-uma-buzzword-de-souza-janones-tpkxf tratei sobre o tema...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Aprender Idiomas com Google Tradutor: Na Prática

O Google está lançando um novo recurso experimental com tecnologia de IA no Google Tradutor, projetado para ajudar as...

Comunidades Internacionais de Desenvolvedores

Descubra as melhores comunidades internacionais de devs para 2026: GitHub, Stack Overflow, Discord e mais. Comparativo de salários Brasil vs. exterior e guia de carreira remota.

Mais Lidos

Proteção de APIs: Guia Definitivo de Segurança

A missão de um CISO é capacitar a empresa...

Segurança em APIs com OpenAPI: Guia de Melhores Práticas

Aprenda a configurar esquemas de segurança no OpenAPI (Swagger)....

Python de Alto Desempenho: Guia para Codon (Guia Prático)

Um novo compilador Python de alto desempenho acaba de...

VS Code, Copilot e DBCode: Produtividade com Banco de Dados

Como Aumentar a Produtividade no Desenvolvimento com VS Code,...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Você vai gostarrelacionados
Continue aprendendo

E-Zine Dev Ramos

Quer dominar arquitetura e IA?

Junte-se a +10.000 profissionais. Receba semanalmente estratégias de Node.js, React e IA que nunca publicamos no blog.

Assinar Gratuitamente Zero spam. Cancele quando quiser.