PRODPiattaforma BaaS europea sovranaApri Dashboard →

Prestazioni · 9 lettura minima

Postgres 16 vs 17 vs 18: le vittorie che contano

Affane Daylami · Fondateur · 27 maggio 2026

Torniamo al blog

Postgres 17 non è "più veloce" di Postgres 16 su un vago insieme di query. Il vero guadagno deriva da due aree specifiche: la memoria consumata da VACUUM su tavoli di grandi dimensioni e la contesa sulle connessioni con elevata concorrenza. Postgres 18, rilasciato alla fine del 2025, aggiunge un cambiamento ancora più profondo: input-output asincrono. Ecco cosa cambiano realmente queste versioni, con i relativi sorgenti, e perché Aurabase continua a eseguire Postgres 16 in produzione oggi, nonostante ciò.

Questo testo inglese è stato generato automaticamente dall'originale francese e non è stato ancora rivisto.
Questa pagina è stata tradotta automaticamente. Fa fede la versione inglese.

Questo articolo si basa sulla documentazione ufficiale del progetto PostgreSQL e su due analisi tecniche pubblicate dopo ogni versione principale, Microsoft Tech Community (team del database di Azure per PostgreSQL) e Crunchy Data. Nessuna figura sottostante è un benchmark da noi riprodotto: quando il dato proviene da terzi, lo indichiamo, con relativa fonte e data. Per la metodologia che applichiamo alle nostre misurazioni, consulta il nostro pilastro della metodologia di benchmark .

L'essenziale
  • Il vantaggio principale di Postgres 17 è la revisione della memoria VACUUM (struttura TidStore), che rimuove il vecchio limite di circa 1 GB. Le note di rilascio ufficiali indicano che in alcuni casi viene utilizzata fino a 20 volte meno memoria.
  • Postgres 17 riduce anche il conflitto sul calcolo degli snapshot delle transazioni, il che avvantaggia soprattutto le istanze ad alta concorrenza su hardware multi-core.
  • Postgres 18 (fine settembre 2025) introduce l'I/O asincrono (AIO), la modifica architetturale più strutturale in diverse versioni principali, in particolare per lo storage ad alta latenza.
  • Postgres 18 aggiunge anche il salto della scansione su indici B-tree a più colonne, colonne generate virtuali per impostazione predefinita e supporto OAuth 2.0 per l'autenticazione.
  • Aurabase esegue oggi Postgres 16.15 in produzione, verificato nel codice: nessun ritardo, una scelta documentata legata all'irreversibilità degli aggiornamenti di versione principali sotto CloudNativePG.
#
Panoramica

Cosa cambia veramente tra Postgres 16, 17 e 18

Le tre versioni non si distinguono per un unico dato prestazionale complessivo. Ognuno corregge un punto specifico dell'architettura, con un pubblico ogni volta diverso: tabelle di grandi dimensioni per Postgres 17, storage ad alta latenza per Postgres 18. La tabella seguente riassume i fatti verificabili, tutti datati, prima di entrare nei dettagli di ciascun progetto.

VersionePostgreSQL16PostgreSQL17PostgreSQL18
Data di rilascio14 settembre 202326 settembre 2024fine settembre 2025
VUOTO su tavoli di grandi dimensioniTuple morte nell'array, limite di memoria ≈ 1 GBStruttura TidStore (albero radix), soffitto rialzatoEredita la struttura introdotta in 17
Ingresso-uscitaSincrono, blocco per bloccoStreaming I/O per ANALISI e scansioni sequenzialiI/O asincrono generalizzato (AIO), io_method configurabile
Connessioni simultaneeConflitto noto sul calcolo dello snapshotContesa ridotta (ottimizzata GetSnapshotData)Eredita i plus introdotti nel 17
Indice B-tree a più colonneScansione completa se la colonna principale manca dal filtroUguale a Postgres 16Salta scansione: è possibile la scansione parziale
Colonne generateSolo MEMORIZZATOUguale a Postgres 16Aggiunto VIRTUALE, diventa comportamento predefinito
AutenticazioneSCRAM, LDAP, certificatiUguale a Postgres 16+ OAuth 2.0 (RFC 8628, flusso del dispositivo)

Fonti: note di rilascio ufficiali del progetto PostgreSQL (postgresql.org), riferimenti incrociati con analisi pubblicate da Microsoft Tech Community e Crunchy Data dopo ogni versione principale. Accesso effettuato il 24 agosto 2026.

#
Postgres 17

La revisione della memoria di VACUUM è un punto di svolta per i grandi tavoli

Prima di Postgres 17, VACUUM memorizzava l'elenco delle tuple morte da ripulire in un semplice array, dimensionato da maintenance_work_mem. Il problema non era la velocità di calcolo, ma la struttura stessa: questa tabella si attestava intorno a 1 GB, non importa quanto fosse configurato oltre. Su una tabella con più di 178 milioni di righe morte, VACUUM ha dovuto eseguire il loop in più passaggi, ciascuno rileggendo l'intero indice.

Postgres 17 sostituisce questo array con una struttura chiamata TidStore, un albero radice adattivo che comprime pesantemente lo spazio necessario per memorizzare gli identificatori di tupla. Le note di rilascio ufficiali del progetto indicano una riduzione della memoria utilizzata da VACUUM fino a 20 volte in alcuni casi, senza il soffitto artificiale associato alla vecchia struttura. Fonte: note di rilascio ufficiali di PostgreSQL 17, postgresql.org, 26 settembre 2024. Microsoft Tech Community e Crunchy Data hanno pubblicato ciascuno un'analisi tecnica di questa modifica subito dopo il rilascio. Entrambi confermano l'interesse concreto per tabelle di diverse centinaia di milioni di righe, con un elevato tasso di cancellazione o aggiornamento.

×20
Meno memoria VACUUM
casi misurati, note sulla versione di PostgreSQL 17
≈1GB
Vecchio soffitto della memoria
struttura dell'array di tuple morte, Postgres ≤16
16.15
Versione che supporta Aurabase
codice registrato il 24 agosto 2026

Questo progetto avvantaggia principalmente uno scenario specifico: una tabella di grandi dimensioni con un'elevata frequenza di eliminazione o aggiornamento. VACUUM in precedenza veniva eseguito in più passaggi a causa della mancanza di memoria disponibile. Su un tavolino, o con un carico prevalentemente di lettura, il guadagno rimane marginale, o addirittura invisibile.

#
Postgres 17

Meno contese sulle connessioni ad alta concorrenza

Il secondo progetto Postgres 17 tocca un punto più discreto: il calcolo delle istantanee delle transazioni. Ogni query deve sapere quali altre transazioni sono in corso per applicare le regole di visibilità MVCC di Postgres. Su una macchina con un numero elevato di core e connessioni attive, questo calcolo ha generato contesa su una struttura interna condivisa. Questo è un collo di bottiglia documentato da molto tempo dai contributori del progetto.

Postgres 17 riduce questa contesa. L'effetto viene misurato principalmente su istanze ad alta concorrenza, con molte connessioni attive simultanee su hardware multi-core. Con un carico di concorrenza basso, la differenza con Postgres 16 rimane marginale: si tratta di un progetto di scalabilità, non di riduzione della latenza per richiesta isolata.

Questo guadagno non sostituisce un pool di connessioni, ne riduce semplicemente i costi interni. Se il numero di connessioni attive è già il tuo collo di bottiglia, la versione principale passa in secondo piano. La nostra guida all'ottimizzazione max_connections e il nostro Confronto delle modalità di transazione PgBouncer esplorano questo argomento in modo più dettagliato.

#
Postgres 18

I/O asincrono: il cambiamento architetturale più profondo degli ultimi anni

Postgres 18, rilasciato alla fine di settembre 2025, affronta un problema più strutturale. Fino ad allora, ogni lettura del disco Postgres bloccava il processo che lo richiedeva. Il nuovo sottosistema input-output asincrono (AIO) consente a un processo di avviare più letture in parallelo e continuare a lavorare mentre vengono completate, invece di attendere ciascuna in sequenza.

Il parametro io_method controlla questo comportamento: worker (processi dedicati all'I/O, predefinito) o io_uring su Linux, quando Postgres è stato compilato con questo supporto. Scansioni sequenziali, scansioni di heap bitmap e VACUUM sono i primi beneficiari, in particolare sullo storage ad alta latenza: dischi di rete, volumi cloud, piuttosto che NVMe locale.

PlanetScale, che offre un'offerta Postgres gestita, ha pubblicato i propri confronti Postgres 17 vs 18 incentrati su questa modifica I/O. Queste sono le loro misurazioni sulla propria infrastruttura, non cifre che abbiamo riprodotto qui in modo indipendente. Prendilo come un segnale che vale la pena testare l'argomento sul tuo carico effettivo, non come percentuale universale.

L'AIO generalizzato di Postgres 18 continua un progetto iniziato in Postgres 17, non un cambiamento isolato. La versione 17 aveva già introdotto l'interfaccia di streaming I/O, ma limitata ad ANALISI e scansioni sequenziali. Postgres 18 estende questa stessa logica a un ambito più ampio di operazioni, comprese le scansioni VACUUM e heap bitmap. Le due versioni quindi si leggono come una progressione, non come due scommesse separate su I/O.

#
Postgres 18

Altri cambiamenti che contano

Vale la pena monitorare altre tre modifiche a Postgres 18, anche se non riguardano direttamente le prestazioni grezze.

Lo skip scan sull'indice B-tree a più colonne consente a Postgres di utilizzare un indice composito anche quando la query non filtra sulla sua colonna principale. Prima di Postgres 18, questo scenario spesso richiedeva una scansione completa della tabella o la creazione di un ulteriore indice dedicato.

Le colonne virtuali generate (GENERATED ALWAYS AS (...) VIRTUAL) diventano il comportamento predefinito quando STORED non è specificato. Una colonna virtuale viene calcolata in lettura anziché essere scritta su disco, riducendo così la quantità scritta ogni volta che la riga di origine viene inserita o aggiornata.

Postgres 18 aggiunge infine il supporto per OAuth 2.0 dal lato dell'autenticazione (RFC 8628, flusso del dispositivo), insieme ai meccanismi esistenti come SCRAM, certificati o LDAP. Un punto rilevante per qualsiasi organizzazione che già centralizza le proprie identità tramite un provider OAuth/OIDC esterno.

#
Caso reale

Perché Aurabase funziona ancora su Postgres 16 e cosa cambierebbe questa scelta

In Aurabase, il database dei tenant attualmente viene eseguito in Postgres 16.15, non 17. Questo può essere verificato direttamente nel repository: l'immagine CNPG di riferimento (docker/Postgres.CNPG.Dockerfile) inizia da ghcr.io/cloudnative-pg/postgresql:16-standard-bookworm, bloccata da digest, la stessa versione principale del livello condiviso (docker/Postgres.Dockerfile). Verificato il 24 agosto 2026.

Il codice documenta anche il perché. Un commento di correzione in k8s_tenant.rs spiega che un fallback precedente puntava erroneamente a postgresql:17.2. Il motivo addotto all'epoca, ovvero che l'immagine standard non avrebbe incluso pgvettoriale, si è rivelato falso dopo la verifica. Entrambe le immagini hanno pgvector: 0.8.0 su 17.2, 0.8.5 su 16-standard-bookworm misurato sul cluster della flotta.

Il rischio reale, documentato nel commento stesso, è altrove: CloudNativePG vieta qualsiasi downgrade di versione principale una volta creato un Cluster. Una flotta rifornita per errore in Postgres 17 sarebbe irreversibile, mentre tutto ciò che è stato convalidato end-to-end in Aurabase era in Postgres 16.

k8s_tenant.rs (estratto semplificato)rust
// Versione principale mantenuta se TENANT_POSTGRES_IMAGE non è definito
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."
);

Questo non è un giudizio su Postgres 17 in quanto tale. È una politica di prudenza operativa: non passare da un parco di produzione a una versione principale finché non è seguita la convalida end-to-end. Lo stesso ragionamento vale per qualsiasi team che gestisce Postgres tramite CloudNativePG o un operatore Kubernetes equivalente. La domanda non è solo il miglioramento delle prestazioni atteso, ma anche il percorso di ritorno se qualcosa va storto.

Nessun rollback su una versione principale

PostgreSQL non offre downgrade importanti della versione. pg_upgrade migra in una sola direzione e CloudNativePG applica lo stesso vincolo a livello del suo operatore. L'unico modo per tornare indietro è ripristinare un backup precedente all'aggiornamento o iniziare da una nuova istanza nella vecchia versione.

Dovresti migrare a Postgres 17 o 18 adesso?

Tre criteri permettono di decidere senza attendere una cifra universale. Innanzitutto, la dimensione e il tasso di mutazione delle tabelle più grandi: se VACUUM è già in esecuzione in più passaggi, il cantiere di memoria Postgres 17 si applica direttamente al tuo caso. Poi, il tuo spazio di archiviazione: su un SSD locale a bassa latenza, l'I/O asincrono di Postgres 18 fornisce meno che su un volume di rete. Infine, torniamo indietro: su un operatore che vieta downgrade importanti, testare prima su un ambiente usa e getta non è una precauzione facoltativa.

Concretamente, la stessa regola si applica a qualsiasi flotta gestita da un operatore Kubernetes. Per prima cosa esegui il provisioning di un cluster di test nella versione di destinazione, quindi riproduci su di esso un carico rappresentativo della tua produzione. Tocca il cluster effettivo solo dopo che questo test è stato convalidato end-to-end, non limitarti a leggere le note di rilascio. Se la tua decisione riguarda anche la scelta tra base dedicata e base condivisa per assorbire questo tipo di cambiamento, il nostro articolo base dedicata vs base condivisa esplora questo angolo.

#
Domande frequenti

Quello che ci viene chiesto più spesso

Postgres 17 è più veloce di Postgres 16 nell'uso generale?+
Non uniformemente. Il guadagno concreto si concentra su due punti specifici: la memoria utilizzata da VACUUM su tabelle di grandi dimensioni e la contesa sulle connessioni ad alta concorrenza. Con un carico leggero e con tavolini, la differenza rimane appena percettibile.
Possiamo tornare da Postgres 17 o 18 a Postgres 16 dopo un aggiornamento?+
No, non direttamente. PostgreSQL non offre un downgrade principale della versione una volta completato l'aggiornamento: pg_upgrade migra in una sola direzione. L'unico modo possibile è ripristinare un backup precedente all'aggiornamento o iniziare da una nuova istanza nella vecchia versione.
L'I/O asincrono Postgres 18 è abilitato per impostazione predefinita?+
Il sottosistema esiste per impostazione predefinita, ma con io_method=worker (processi dedicati all'I/O), non io_uring. io_uring rimane un'opzione su Linux, da attivare esplicitamente quando Postgres sarà compilato con questo supporto.
Quale versione di Postgres utilizza oggi Aurabase?+
Postgres 16.15, due terzi (base condivisa e base dedicata per progetto), verificato in docker/Postgres.Dockerfile e docker/Postgres.CNPG.Dockerfile il 24 agosto 2026. Questo non è un limite permanente, ma solo l'attuale stato convalidato end-to-end.
#
In sintesi

Le prestazioni contano meno della reversibilità

La scelta tra Postgres 16, 17 e 18 non riguarda solo quale versione sia “più veloce”. Postgres 17 risolve un vero problema strutturale di VACUUM su tabelle di grandi dimensioni e riduce la contesa ad alta concorrenza. Postgres 18 va oltre con l'I/O asincrono, una modifica dell'architettura che richiede test sul carico e sullo storage effettivi prima di essere generalizzata.

Il criterio più spesso dimenticato non è la prestazione, bensì la reversibilità. Su un operatore come CloudNativePG, un aggiornamento importante della versione non viene annullato a posteriori. Prima di convertire una flotta di produzione, la vera questione non è solo il guadagno atteso, ma anche il percorso di ritorno in caso di fallimento del test. Se ti stai preparando per questo aggiornamento di versione, la nostra lista di controllo per l'ottimizzazione di Postgres in produzione descrive in dettaglio le impostazioni da riconvalidare dopo una modifica importante della versione.

PRONTO PER L'IMPLEMENTAZIONE?

Il tuo backend in cinque minuti.

Nessuna carta di credito richiesta · 500 MB gratuiti · 50.000 MAU