Dopo un anno di sviluppo, è stata pubblicata una nuova versione stabile del database PostgreSQL 18. Gli aggiornamenti per questa nuova versione saranno rilasciati per cinque anni fino a novembre 2030. Il supporto per PostgreSQL 13.x, la versione più vecchia supportata, terminerà il 13 novembre.
Novità principali:
- È stata aggiunta una sottosistema di input/output asincrono che aumenta la larghezza di banda di input/output ed elimina i ritardi. Oltre alla generica implementazione AIO (io_method=worker) disponibile su tutte le piattaforme, basata sull'esecuzione di più processi handler (3 per impostazione predefinita), in Linux può essere utilizzata l'interfaccia di input/output asincrono io_uring (io_method=io_uring), supportata a partire dal kernel Linux 5.1. L'input/output asincrono è attualmente attivato solo per velocizzare l'esecuzione di alcune operazioni di lettura dei dati dal filesystem, come l'iterazione sequenziale, la scansione della mappa degli indici e le operazioni di pulizia (vacuum). In alcuni test, l'uso di AIO porta a un aumento delle prestazioni da 2 a 3 volte. Le operazioni di scrittura continuano a essere eseguite in modalità sincrona per soddisfare i requisiti ACID.
- È stata implementata l'ottimizzazione "skip scan" negli indici multicolonna, che consente l'uso dell'indice non solo per verificare la prima colonna indicizzata e l'intera legatura delle colonne, ma anche per elaborare separatamente le altre colonne indicizzate. Ad esempio, in precedenza, quando si creava un indice B-tree su colonne "(status, date)", l'indice veniva applicato solo per le query che verificavano il campo "status" o entrambi i campi "status" e "date", mentre durante la verifica di una query solo sul campo "date" veniva eseguita una scansione del contenuto della tabella. La modalità "skip scan" consente in determinate situazioni di scansionare l'indice per una query solo sul campo "date". Questa modalità è utilizzabile solo per gli indici "B-tree" quando viene utilizzato un operatore condizionale "=" sul campo indicizzato, in situazioni in cui il campo saltato ha un numero ridotto di valori distintivi (ad esempio, l'ottimizzazione funziona se il campo dello stato "status" ha pochi valori fissi).
- Sono state aggiunte ottimizzazioni che utilizzano più efficacemente gli indici per le query contenenti costrutti "OR" e "IN (…)" nel blocco "WHERE", oltre a migliorare le prestazioni della pianificazione e dell'esecuzione delle operazioni di join tra tabelle (ad esempio, è stato velocizzato il codice di fusione degli hash e consentito l'uso dell'ordinamento incrementale durante la fusione delle tabelle).
- È stato aggiunto il supporto per il parallelismo nella creazione di indici GIN (Generalized Inverted Index), utilizzati per indicizzare valori complessi, come array, e per organizzare la ricerca nei dati di testo completo o nelle strutture JSON.
- È stata aggiunta la possibilità di creare viste materializzate e chiavi per la partizione di tabelle con indici di tipo "unique", che non utilizzano la struttura B-tree.
- È stata migliorata l'efficienza complessiva dei lock per le query che operano su un gran numero di tabelle, sono stati effettuati miglioramenti anche nella gestione delle query su tabelle partizionate, accelerando il filtraggio delle sezioni non utilizzate e le operazioni di join.
- È stato accelerato il trattamento del testo, come le funzioni di conversione in maiuscolo/minuscolo. È stata aggiunta la modalità PG_UNICODE_FAST per velocizzare la gestione delle proprietà dei caratteri Unicode.
- È stata implementata la possibilità di salvare le statistiche del pianificatore delle query dopo l'aggiornamento tra rilascio significativi di PostgreSQL. Questa modifica permette di evitare l'esecuzione di un'operazione ad alta intensità di risorse come 'ANALYZE' dopo il lancio di una nuova versione, durante la quale si riscontrano prestazioni ridotte nel DBMS.
- È stata aumentata l'efficienza dell'utilità pg_upgrade, utilizzata per automatizzare la migrazione a un nuovo rilascio significativo di PostgreSQL. Le ottimizzazioni sono particolarmente evidenti durante l'aggiornamento di database contenenti un gran numero di oggetti, come tabelle e sequenze. Per accelerare il funzionamento di pg_upgrade, è stato anche aggiunto un flag "—jobs N" per parallelizzare i controlli in N thread e un flag "—swap" per sostituire completamente le cartelle con i dati senza la creazione di link, senza clonazione e senza copia dei file.
- È stata aggiunta la supporto per le colonne generate virtualmente, i cui valori vengono calcolati al volo durante l'esecuzione delle query, senza essere memorizzati su disco. Se nell'espressione "CREATE TABLE..." si utilizza solo la parola chiave "GENERATED" senza specificare il tipo (STORED o VIRTUAL), viene applicata la nuova versione per impostazione predefinita invece della vecchia implementazione. Nella vecchia implementazione, i valori venivano generati durante le operazioni di "INSERT" o "UPDATE" e salvati su disco per utilizzi futuri. Lo svantaggio delle colonne generate virtualmente è l'impossibilità di utilizzarle negli indici, mentre il vantaggio è la possibilità di normalizzare e modificare i dati al volo (particolarmente rilevante durante la gestione di dati JSON). Per quanto riguarda le colonne generate classiche archiviate, il nuovo rilascio fornisce supporto per la replica logica.
- Nei comandi INSERT, UPDATE, DELETE e MERGE è stata implementata la possibilità di restituire i valori passati (OLD) e correnti (CURRENT) nell'espressione RETURNING. Ad esempio, "UPDATE... RETURNING WITH (OLD AS o, NEW AS n) o.*, n.*.".
- È stata aggiunta la funzione uuidv7() per generare identificatori unici casuali nel formato UUIDv7. A differenza della vecchia funzione per generare UUID (gen_random_uuid), ora disponibile anche con il nome uuidv4(), in UUIDv7 oltre al valore casuale viene incluso il tempo di generazione. La presenza di parti ordinate nel valore UUID (i primi 12 caratteri rappresentano il tempo epochale, mentre i successivi 18 il valore casuale) migliora l'efficienza di ordinamento e indicizzazione, essendo frequentemente utilizzati per le chiavi primarie (ad esempio, le chiavi create in tempi ravvicinati sono vicine l'una all'altra nell'indice).
- Nell'operazione "LIKE" è stata implementata la supporto per i confronti di testo che utilizzano proprietà di collazione non deterministiche, consentendo confronti che considerano il significato dei simboli (ad esempio, rispetto a segni diacritici). È stata aggiunta la funzione CASEFOLD per cambiare la capitalizzazione dei simboli tenendo conto delle proprietà di collazione (ad esempio, alcuni simboli hanno più di due varianti minuscole o durante il confronto richiedono la trasformazione in maiuscolo anziché in minuscolo).
- È stata aggiunta la possibilità di utilizzare vincoli temporali (temporal constraint). Nei valori "PRIMARY KEY" e "UNIQUE" per aggiungere vincoli temporali, è necessario utilizzare l'espressione "WITHOUT OVERLAPS", mentre per il valore "FOREIGN KEY" si utilizza l'espressione PERIOD. Ad esempio, nel definire chiavi primarie, è possibile limitare le chiavi con intervalli temporali sovrapposti.
- È stato aggiunto il comando "CREATE FOREIGN TABLE … LIKE command" per creare uno schema di tabella esterna basato sulla definizione di una tabella locale.
- È stato aggiunto il supporto per la connessione ai DBMS utilizzando l'autenticazione basata su OAUTH 2.0 utilizzando un token di accesso al posto della password. L'uso di OAUTH consente di non memorizzare le password nei DB, identificando gli utenti attraverso servizi esterni e sfruttando funzionalità come l'autenticazione a due fattori e il single sign-on (SSO).
- È stata aggiunta la funzione ssl_tls13_ciphers(), attraverso la quale è possibile determinare l'elenco degli algoritmi di crittografia consentiti durante la connessione utilizzando il protocollo TLSv1.3.
- La supporto per l'autenticazione utilizzando l'algoritmo md5 per l'hashing delle password è stata trasferita nella categoria delle funzionalità obsolete e pianificate per la rimozione. Si raccomanda di utilizzare l'algoritmo SCRAM (SCRAM-SHA-256), introdotto in PostgreSQL 10. Inoltre, è stata implementata la possibilità di passare l'autenticazione basata su SCRAM quando ci si connette tramite postgres_fdw e dblink a server PostgreSQL esterni.
- Durante l'esecuzione dell'operazione "EXPLAIN ANALYZE" è stata fornita l'uscita delle informazioni sul numero di operazioni di ricerca negli indici durante la scansione dell'indice e sul numero di accessi ai buffer durante l'esecuzione della query. Nell'uscita di "EXPLAIN ANALYZE VERBOSE" è inclusa la statistica su CPU, WAL journal e intensità delle operazioni di lettura. Nella tabella pg_stat_all_tables sono state aggiunte informazioni sul tempo speso per le operazioni di VACUUM e analisi delle tabelle. È fornita la statistica sull'intensità di I/O e sul carico del WAL journal in relazione a connessioni specifiche. In pg_stat_subscription_stats e nei log sono state aggiunte informazioni sulla diagnosi dei conflitti durante le operazioni di scrittura durante la replicazione logica.
- Nelle nuove installazioni, per impostazione predefinita è abilitato l'uso di checksum per la verifica dell'integrità dei dati memorizzati. Per disattivare questo comportamento al momento dell'avvio di initdb, è necessario specificare l'opzione "—no-data-checksums".
- Nell'utilità pg_createsubscriber è stata aggiunta l'opzione "—all" per creare repliche logiche con un unico comando per tutti i DB.
- È stata implementata una nuova versione (3.2) del protocollo utilizzato per l'interazione delle utility esterne con il DBMS, realizzata nella libreria libpq. L'ultima aggiornamento del protocollo è avvenuto in PostgreSQL 7.4 (2003). Nella libreria libpq continua a essere utilizzata per impostazione predefinita la versione 3.0.
Fonte: opennet.ru
