PRODPlataforma BaaS europeia soberanaAbra o painel →

Desempenho · 9 minutos de leitura

Postgres 16 vs 17 vs 18: ganhos que importam

Affane Daylami · Fondateur · 27 de maio de 2026

Voltar ao blog

O Postgres 17 não é "mais rápido" que o Postgres 16 em um conjunto vago de consultas. O ganho real vem de duas áreas específicas: a memória consumida pelo VACUUM em mesas grandes, e a contenção em conexões com alta concorrência. O Postgres 18, lançado no final de 2025, adiciona uma mudança ainda mais profunda: entrada-saída assíncrona. Aqui está o que essas versões realmente mudam, com suas fontes, e por que o Aurabase ainda está executando o Postgres 16 em produção hoje, apesar disso.

Este texto em inglês foi gerado automaticamente a partir do original em francês e ainda não foi revisado.
Esta página foi traduzida automaticamente. A versão em inglês é oficial.

Este artigo baseia-se na documentação oficial do projeto PostgreSQL e em duas análises técnicas publicadas após cada lançamento principal, Microsoft Tech Community (equipe do Banco de Dados Azure para PostgreSQL) e Crunchy Data. Nenhuma figura abaixo é um benchmark reproduzido por nós: quando os dados provêm de terceiros, nós os indicamos, com sua fonte e data. Para a metodologia que aplicamos às nossas próprias medições, consulte nosso pilar de metodologia de benchmark .

O essencial
  • O principal ganho do Postgres 17 é a revisão da memória do VACUUM (estrutura TidStore), que remove o antigo limite de cerca de 1 GB. As notas oficiais de lançamento indicam até 20x menos memória usada em alguns casos.
  • O Postgres 17 também reduz a contenção no cálculo de instantâneos de transações, o que beneficia especialmente instâncias de alta simultaneidade em hardware multi-core.
  • O Postgres 18 (final de setembro de 2025) introduz E/S assíncrona (AIO), a mudança arquitetônica mais estrutural em várias versões principais, especialmente para armazenamento de alta latência.
  • O Postgres 18 também adiciona varredura de salto em índices de árvore B de múltiplas colunas, colunas geradas virtuais por padrão e suporte OAuth 2.0 para autenticação.
  • Aurabase está executando o Postgres 16.15 em produção hoje, verificado no código: não é um atraso, uma escolha documentada ligada à irreversibilidade das principais atualizações de versão no CloudNativePG.
#
Visão geral

O que realmente muda entre o Postgres 16, 17 e 18

As três versões não se distinguem por um único valor de desempenho geral. Cada um corrige um ponto específico da arquitetura, com um público diferente a cada vez: tabelas grandes para Postgres 17, armazenamento de alta latência para Postgres 18. A tabela abaixo resume os fatos verificáveis, todos datados, antes de entrar nos detalhes de cada projeto.

VersãoPostgreSQL 16PostgreSQL 17PostgreSQL 18
Data de lançamento14 de setembro de 202326 de setembro de 2024final de setembro de 2025
VACUUM em mesas grandesTuplas mortas na matriz, limite de memória ≈ 1 GBEstrutura TidStore (árvore radix), teto elevadoHerda a estrutura introduzida em 17
Entrada-saídaSíncrono, bloco por blocoStreaming de E/S para ANALYZE e varreduras sequenciaisE/S assíncrona generalizada (AIO), configurável io_method
Conexões simultâneasContenção conhecida no cálculo do instantâneoContenção reduzida (GetSnapshotData otimizado)Herda os ganhos introduzidos em 17
Índice de árvore B de múltiplas colunasVerificação completa se a coluna principal estiver faltando no filtroIgual ao Postgres 16Ignorar verificação: verificação parcial possível
Colunas geradasARMAZENADO apenasIgual ao Postgres 16Adicionado VIRTUAL, torna-se comportamento padrão
AutenticaçãoSCRAM, LDAP, certificadosIgual ao Postgres 16+ OAuth 2.0 (RFC 8628, fluxo do dispositivo)

Fontes: notas de lançamento oficiais do projeto PostgreSQL (postgresql.org), com referência cruzada com análises publicadas pela Microsoft Tech Community e Crunchy Data após cada lançamento principal. Acessado em 24 de agosto de 2026.

#
Postgres 17

A revisão da memória do VACUUM é uma virada de jogo para mesas grandes

Antes do Postgres 17, VACUUM armazenava a lista de tuplas mortas para limpar em um array simples, dimensionado por maintenance_work_mem. O problema não era a velocidade do cálculo, mas a estrutura em si: essa tabela estagnava em torno de 1 GB, por mais que fosse configurado além disso. Em uma tabela com mais de 178 milhões de linhas mortas, o VACUUM teve que fazer um loop em várias passagens, cada uma relendo os índices inteiros.

O Postgres 17 substitui esse array por uma estrutura chamada TidStore, uma árvore de raiz adaptativa que comprime fortemente o espaço necessário para armazenar identificadores de tupla. As notas oficiais de lançamento do projeto indicam uma redução de memória utilizada pelo VACUUM em até 20 vezes em alguns casos, sem o teto artificial associado à estrutura antiga. Fonte: Notas de lançamento oficiais do PostgreSQL 17, postgresql.org, 26 de setembro de 2024. A Microsoft Tech Community e a Crunchy Data publicaram, cada uma, uma análise técnica dessa mudança logo após o lançamento. Ambos confirmam o interesse concreto por tabelas com várias centenas de milhões de linhas, com alta taxa de exclusão ou atualização.

×20
Menos memória VACUUM
casos medidos, notas de versão do PostgreSQL 17
≈1GB
Teto de memória antigo
estrutura de matriz de tupla morta, Postgres ≤16
16.15
Versão com suporte para Aurabase
código verificado em 24 de agosto de 2026

Este projeto beneficia principalmente um cenário específico: uma tabela grande com alta taxa de exclusão ou atualização. Anteriormente, o VACUUM era executado em várias passagens devido à falta de memória disponível. Numa mesa pequena, ou numa carga predominantemente de leitura, o ganho permanece marginal, ou mesmo invisível.

#
Postgres 17

Menos contenção em conexões de alta simultaneidade

O segundo projeto Postgres 17 aborda um ponto mais discreto: o cálculo de instantâneos de transações. Cada consulta precisa saber quais outras transações estão em andamento para impor as regras de visibilidade MVCC do Postgres. Em uma máquina com elevado número de núcleos e conexões ativas, esse cálculo gerou contenção em uma estrutura interna compartilhada. Este é um gargalo documentado há muito tempo pelos colaboradores do projeto.

O Postgres 17 reduz essa contenção. O efeito é medido principalmente em instâncias de alta simultaneidade, com muitas conexões ativas simultâneas em hardware multinúcleo. Numa carga de simultaneidade baixa, a diferença com o Postgres 16 permanece marginal: é um projeto de escalabilidade, não uma redução na latência por solicitação isolada.

Este ganho não substitui um pooler de conexões, simplesmente reduz seu custo interno. Se o número de conexões ativas já é o seu gargalo, a versão principal fica em segundo plano. Nosso guia de ajuste max_connections e nossa comparação de modo de transação PgBouncer exploram esse assunto com mais detalhes.

#
Postgres 18

E/S assíncrona: a mudança arquitetônica mais profunda em anos

O Postgres 18, lançado no final de setembro de 2025, aborda um problema mais estrutural. Até então, toda leitura de disco do Postgres bloqueava o processo que a solicitava. O novo subsistema de entrada-saída assíncrona (AIO) permite que um processo inicie múltiplas leituras em paralelo e continue trabalhando enquanto elas são concluídas, em vez de esperar por cada uma delas sequencialmente.

O parâmetro io_method controla este comportamento: worker (processos dedicados a I/O, padrão) ou io_uring no Linux, quando o Postgres foi compilado com este suporte. Varreduras sequenciais, varreduras de heap de bitmap e VACUUM são os primeiros beneficiários, especialmente em armazenamento de alta latência: discos de rede, volumes de nuvem, em vez de NVMe local.

A PlanetScale, que oferece uma oferta gerenciada do Postgres, publicou suas próprias comparações do Postgres 17 vs 18 focadas nesta mudança de E/S. Estas são as medições feitas em sua própria infraestrutura, e não números que reproduzimos aqui de forma independente. Considere isso como um sinal de que vale a pena testar o assunto em sua carga real, não como uma porcentagem universal.

O AIO generalizado do Postgres 18 continua um projeto iniciado no Postgres 17, não uma mudança isolada. A versão 17 já havia introduzido a interface de E/S de streaming, mas limitada a ANALYZE e varreduras sequenciais. O Postgres 18 estende essa mesma lógica para um escopo mais amplo de operações, incluindo VACUUM e varreduras de heap de bitmap. As duas versões, portanto, são lidas como uma progressão, e não como duas apostas separadas em I/O.

#
Postgres 18

Outras mudanças que importam

Vale a pena monitorar três outras alterações do Postgres 18, mesmo que não abordem diretamente o desempenho bruto.

O ignorar varredura no índice de árvore B de múltiplas colunas permite que o Postgres use um índice composto mesmo quando a consulta não filtra em sua coluna principal. Antes do Postgres 18, esse cenário geralmente exigia uma verificação completa da tabela ou a criação de um índice dedicado adicional.

As colunas virtuais geradas por (GENERATED ALWAYS AS (...) VIRTUAL) tornam-se o comportamento padrão quando STORED não é especificado. Uma coluna virtual é calculada na leitura em vez de ser gravada no disco, o que reduz a quantidade gravada cada vez que a linha de origem é inserida ou atualizada.

O Postgres 18 finalmente adiciona suporte para OAuth 2.0 no lado da autenticação (RFC 8628, fluxo de dispositivo), juntamente com mecanismos existentes como SCRAM, certificados ou LDAP. Um ponto relevante para qualquer organização que já centraliza suas identidades através de um provedor externo OAuth/OIDC.

#
Caso real

Por que o Aurabase ainda roda no Postgres 16 e o que mudaria essa escolha

No Aurabase, o banco de dados de locatários atualmente é executado em Postgres 16.15, não 17. Isso pode ser verificado diretamente no repositório: a imagem CNPG de referência (docker/Postgres.CNPG.Dockerfile) começa em ghcr.io/cloudnative-pg/postgresql:16-standard-bookworm, fixada por digest, a mesma versão principal da camada compartilhada (docker/Postgres.Dockerfile). Verificado em 24 de agosto de 2026.

O código também documenta o porquê. Um comentário de correção em k8s_tenant.rs explica que um substituto anterior apontou erroneamente para postgresql:17.2. O motivo apresentado na época, a imagem padrão não incluiria o pgvector, revelou-se falso após verificação. Ambas as imagens têm pgvector: 0.8.0 em 17.2, 0.8.5 em 16-bookworm padrão medido no cluster da frota.

O risco real, documentado no próprio comentário, está em outro lugar: CloudNativePG proíbe qualquer downgrade de versão principal depois que um cluster for criado. Uma frota provisionada por engano no Postgres 17 seria irreversível, enquanto tudo o que foi validado ponta a ponta no Aurabase estava no Postgres 16.

k8s_tenant.rs (extrato simplificado)rust
// Versão principal mantida se TENANT_POSTGRES_IMAGE não estiver definido
let repli = "ghcr.io/cloudnative-pg/postgresql:16-standard-bookworm";

tracing::warn!(
    image = repli,
    "TENANT_POSTGRES_IMAGE non défini : repli sur la version validée."
);

Este não é um julgamento sobre o Postgres 17 como tal. É uma política de prudência operacional: não mudar uma frota de produção para uma versão principal até que a validação de ponta a ponta tenha sido seguida. O mesmo raciocínio se aplica a qualquer equipe que gerencie Postgres via CloudNativePG ou um operador Kubernetes equivalente. A questão não é apenas o ganho de desempenho esperado, mas também o caminho de volta caso algo dê errado.

Sem reversão em uma versão principal

O PostgreSQL não oferece downgrades de versão principais. pg_upgrade migra apenas em uma direção e CloudNativePG aplica a mesma restrição no nível de seu operador. A única maneira de voltar é restaurar um backup anterior à atualização ou iniciar a partir de uma nova instância na versão antiga.

Você deveria migrar para o Postgres 17 ou 18 agora?

Três critérios permitem decidir sem esperar por um número universal. Primeiro, o tamanho e a taxa de mutação de suas maiores tabelas: se o VACUUM já estiver sendo executado em várias passagens, o local de trabalho de memória do Postgres 17 se aplica diretamente ao seu caso. Então, seu armazenamento: em SSD local de baixa latência, a E/S assíncrona do Postgres 18 fornece menos do que em um volume de rede. Finalmente, o caminho de volta: em uma operadora que proíbe grandes downgrades, testar primeiro em um ambiente descartável não é uma precaução opcional.

Concretamente, a mesma regra se aplica a qualquer frota gerida por um operador Kubernetes. Primeiro provisione um cluster de teste na versão de destino e, em seguida, reproduza nele uma carga representativa de sua produção. Toque no cluster real apenas depois que este teste tiver sido validado de ponta a ponta, e não apenas lendo as notas de versão. Se a sua decisão também diz respeito à escolha entre base dedicada e base compartilhada para absorver esse tipo de mudança, nosso artigo base dedicada vs base compartilhada explora esse ângulo.

#
Perguntas frequentes

O que nos perguntam com mais frequência

O Postgres 17 é mais rápido que o Postgres 16 em uso geral?+
Não uniformemente. O ganho concreto concentra-se em dois pontos específicos: a memória utilizada pelo VACUUM em tabelas grandes e a contenção em conexões de alta simultaneidade. Em uma carga leve com mesas pequenas, a diferença permanece quase imperceptível.
Podemos voltar do Postgres 17 ou 18 para o Postgres 16 após uma atualização?+
Não, não diretamente. O PostgreSQL não oferece downgrade de versão principal após a conclusão da atualização: pg_upgrade migra em apenas uma direção. O único retorno possível é restaurar um backup anterior à atualização, ou iniciar a partir de uma nova instância na versão antiga.
A E/S assíncrona do Postgres 18 está habilitada por padrão?+
O subsistema existe por padrão, mas com io_method=worker (processos dedicados a E/S), não io_uring. io_uring continua sendo uma opção no Linux, a ser ativada explicitamente quando o Postgres for compilado com este suporte.
Qual versão do Postgres o Aurabase usa hoje?+
Postgres 16.15, dois terços (base compartilhada e base dedicada por projeto), verificado em docker/Postgres.Dockerfile e docker/Postgres.CNPG.Dockerfile em 24 de agosto de 2026. Este não é um limite permanente, apenas o estado atual validado de ponta a ponta.
#
Em resumo

O desempenho é menos importante do que a reversibilidade

A escolha entre Postgres 16, 17 e 18 não se trata apenas de qual versão é “mais rápida”. O Postgres 17 corrige um problema estrutural real de VACUUM em tabelas grandes e reduz a contenção em alta simultaneidade. O Postgres 18 vai além com E/S assíncrona, uma mudança arquitetônica que requer testes em sua carga e armazenamento reais antes de ser generalizada.

O critério mais frequentemente esquecido não é o desempenho, é a reversibilidade. Em uma operadora como CloudNativePG, uma atualização de versão principal não é desfeita após o fato. Antes de mudar uma frota de produção, a verdadeira questão não é apenas o ganho esperado, mas também o caminho de retorno caso o teste falhe. Se você estiver se preparando para esta atualização de versão, nossa Lista de verificação de ajuste do Postgres em produção detalha as configurações para revalidar após uma alteração importante de versão.

PRONTO PARA IMPLEMENTAR?

Seu back-end em cinco minutos.

Não é necessário cartão de crédito · 500 MB grátis · 50.000 MAU