Rilascio del DBMS PostgreSQL 18

Dopo un anno di sviluppo è stato pubblicato un nuovo ramo stabile del DBMS PostgreSQL 18. Gli aggiornamenti per il nuovo ramo verranno rilasciati nell'arco di cinque anni fino a novembre 2030. PostgreSQL 13.x, il ramo più vecchio supportato, terminerà il 13 novembre.

Principali innovazioni:

  • È stato aggiunto un sottosistema I/O asincrono per aumentare la velocità di trasmissione I/O ed eliminare la latenza. Oltre all'implementazione AIO universale (io_method=worker) disponibile su tutte le piattaforme, che si basa sull'esecuzione di più processi worker (3 per impostazione predefinita), Linux l'interfaccia I/O asincrona io_uring (io_method=io_uring), supportata dal kernel, può essere utilizzata Linux 5.1. L'I/O asincrono viene attualmente utilizzato solo per velocizzare alcune operazioni relative alla lettura dei dati dal file system, come l'iterazione sequenziale, la scansione della bitmap dell'indice e il vacuum. In alcuni test, l'utilizzo dell'I/O asincrono ha portato a un aumento delle prestazioni di 2-3 volte. Le operazioni di scrittura continuano a essere eseguite in modo sincrono per soddisfare i requisiti ACID.
  • È stata implementata un'ottimizzazione "skip scan" per gli indici multicolonna. Ciò consente di utilizzare l'indice non solo per controllare la prima colonna indicizzata e l'intera catena di colonne, ma anche per elaborare singolarmente le restanti colonne indicizzate. Ad esempio, in precedenza, quando si creava un indice B-tree sulle colonne "(stato, data)", l'indice veniva utilizzato solo per le query che controllavano il campo "stato" o entrambi i campi "stato" e "data". Una scansione della tabella veniva eseguita quando si controllava solo il campo "data" in una query. La modalità "skip scan" consente, in determinate situazioni, una scansione dell'indice quando si interroga solo il campo "data". Questa modalità è applicabile agli indici B-tree solo quando si utilizza l'operatore condizionale "=" su un campo indicizzato in una query, in situazioni in cui il campo saltato ha un numero limitato di valori distinti (ad esempio, l'ottimizzazione funzionerà se il campo "stato" ha diversi valori fissi).
  • Aggiunte ottimizzazioni che rendono più efficiente l'uso degli indici per le query contenenti i costrutti "OR" e "IN (...)" nella clausola "WHERE" e migliorano le prestazioni della pianificazione e dell'esecuzione dell'unione delle tabelle (ad esempio, il codice di unione degli hash è stato velocizzato e ora è consentito l'ordinamento incrementale durante l'unione delle tabelle).
  • Aggiunto supporto per la parallelizzazione della costruzione di indici GIN (Generalized Inverted Index), utilizzati per indicizzare valori compositi come array e per organizzare ricerche su dati full-text o strutture JSON.
  • Aggiunta la possibilità di creare viste materializzate e chiavi per il partizionamento di tabelle con indici univoci che non utilizzano la struttura B-tree.
  • Sono state migliorate le prestazioni complessive di blocco per le query che funzionano con un gran numero di tabelle e sono stati apportati miglioramenti all'elaborazione delle query sulle tabelle partizionate per accelerare l'eliminazione delle partizioni inutilizzate e le operazioni di unione (JOIN).
  • Le operazioni di testo, come le funzioni di conversione maiuscole/minuscole, sono state accelerate. È stata aggiunta la modalità PG_UNICODE_FAST per velocizzare l'elaborazione delle proprietà locali dei caratteri Unicode.
  • Abbiamo implementato la possibilità di preservare le statistiche del query planner dopo l'aggiornamento tra le principali release di PostgreSQL. Questa modifica evita l'operazione "ANALYZE", che richiede molte risorse, dopo l'avvio di una nuova versione, e che può causare un calo delle prestazioni fino al suo completamento.
  • Le prestazioni dell'utility pg_upgrade, utilizzata per automatizzare gli aggiornamenti a una nuova release principale di PostgreSQL, sono state migliorate. Queste ottimizzazioni sono particolarmente evidenti quando si aggiornano database contenenti un gran numero di oggetti, come tabelle e sequenze. Per velocizzare pg_upgrade, abbiamo anche aggiunto il flag "--jobs N" per parallelizzare i controlli su N thread e il flag "--swap" per sostituire intere directory di dati senza collegare, clonare o copiare file.
  • È stato aggiunto il supporto per le colonne generate virtuali, i cui valori vengono calcolati al volo durante l'esecuzione della query, senza salvarli su disco. Se l'istruzione "CREATE TABLE..." specifica solo la parola chiave "GENERATED" per le colonne generate senza specificare un tipo (STORED o VIRTUAL), la nuova implementazione viene utilizzata per impostazione predefinita al posto della vecchia. Nella vecchia implementazione, i valori venivano generati durante le operazioni "INSERT" o "UPDATE" e salvati su disco per un utilizzo successivo. Lo svantaggio delle colonne generate virtuali è che non possono essere utilizzate negli indici, ma il loro vantaggio è la possibilità di normalizzare e modificare i dati al volo (rilevante quando si lavora con dati JSON). Per quanto riguarda le classiche colonne generate memorizzate, la nuova versione fornisce il supporto per la replica logica.
  • I comandi INSERT, UPDATE, DELETE e MERGE ora supportano la possibilità di visualizzare i valori passati (OLD) e correnti (CURRENT) nella clausola RETURNING. Ad esempio, "UPDATE… RETURNING WITH (OLD AS o, NEW AS n) o.*, n.*."
  • È stata aggiunta la funzione uuidv7() per generare identificatori univoci casuali nel formato UUIDv7. A differenza della vecchia funzione di generazione UUID (gen_random_uuid), ora disponibile anche come uuidv4(), UUIDv7 include l'ora di generazione oltre al valore casuale. L'ordinamento delle parti nel valore UUID (i primi 12 caratteri rappresentano l'ora di epoca e i successivi 18 un valore casuale) migliora l'efficienza di ordinamento e indicizzazione, il che è importante poiché gli UUID vengono in genere utilizzati per le chiavi primarie (ad esempio, le chiavi create in momenti simili vengono posizionate una accanto all'altra nell'indice).
  • L'operazione "LIKE" ora supporta i confronti di testo che utilizzano proprietà di confronto locali non deterministiche, consentendo confronti di caratteri significativi (ad esempio, gli accenti possono essere ignorati durante il confronto). È stata aggiunta la funzione CASEFOLD per modificare le maiuscole e le minuscole dei caratteri in base alle proprietà di confronto locali (ad esempio, alcuni caratteri hanno più di due varianti minuscole o richiedono la conversione in maiuscolo durante il confronto).
  • È stata aggiunta la possibilità di utilizzare vincoli temporali. Per i valori PRIMARY KEY e UNIQUE, utilizzare l'espressione WITHOUT OVERLAPS per aggiungere vincoli temporali, mentre per i valori FOREIGN KEY, utilizzare l'espressione PERIOD. Ad esempio, quando si definiscono chiavi primarie, è possibile vincolare le chiavi con intervalli di tempo sovrapposti.
  • Aggiunto il comando "CREATE FOREIGN TABLE … LIKE" per creare uno schema di tabella esterna basato su una definizione di tabella locale.
  • È stato aggiunto il supporto per la connessione a un DBMS tramite autenticazione OAUTH 2.0 con un token di accesso anziché una password. L'utilizzo di OAUTH elimina la necessità di memorizzare le password nel database, consentendo l'autenticazione degli utenti tramite servizi esterni e l'utilizzo di funzionalità come l'autenticazione a due fattori e il Single Sign-On (SSO).
  • È stata aggiunta la funzione ssl_tls13_ciphers(), che può essere utilizzata per definire un elenco di algoritmi di crittografia consentiti durante la connessione tramite il protocollo TLSv1.3.
  • Il supporto per l'autenticazione tramite l'algoritmo di hashing delle password MD5 è stato deprecato e ne è prevista la rimozione. Al posto di MD5, si consiglia di utilizzare l'algoritmo SCRAM (SCRAM-SHA-256), introdotto in PostgreSQL 10. Inoltre, è stato implementato il supporto per l'autenticazione passthrough basata su SCRAM quando ci si connette tramite postgres_fdw e dblink a server PostgreSQL esterni.
  • L'operazione "EXPLAIN ANALYZE" ora visualizza informazioni sul numero di ricerche di indice durante le scansioni di indice e sul numero di accessi al buffer durante l'esecuzione della query. L'output "EXPLAIN ANALYZE VERBOSE" ora include statistiche sulla CPU, sul log WAL e sull'attività di lettura. La tabella pg_stat_all_tables ora visualizza informazioni sul tempo impiegato per l'operazione VACUUM e l'analisi della tabella. Le statistiche sull'attività di I/O e sul carico del log WAL sono ora disponibili per le singole connessioni. pg_stat_subscription_stats e i log ora contengono informazioni sulla diagnostica dei conflitti per le operazioni di scrittura durante la replica logica.
  • Le nuove installazioni abilitano i checksum per impostazione predefinita per verificare l'integrità dei dati memorizzati. Per disabilitare questo comportamento, specificare l'opzione "--no-data-checksums" durante l'esecuzione di initdb.
  • Il flag "--all" è stato aggiunto all'utilità pg_createsubscriber per consentire la creazione di repliche logiche per tutti i database contemporaneamente con un singolo comando.
  • È stata implementata una nuova versione (3.2) del protocollo utilizzato per l'interazione tra utility esterne e il DBMS, implementato nella libreria libpq. L'ultimo aggiornamento del protocollo è stato effettuato in PostgreSQL 7.4 (2003). La libreria libpq continua a utilizzare la versione 3.0 di default.

Fonte: opennet.ru

Acquista hosting affidabile per siti con protezione DDoS, server VPS VDS 🔥 Acquista un hosting web affidabile con protezione DDoS, server VPS e VDS | ProHoster