PostgreSQL 15 - Nuove funzionalita'

La versione PostgreSQL 15 introduce nuove funzionalita' all'RDBMS Open Source piu' avanzato.
E' passato un anno dall'uscita della precedente release e, addirittura in anticipo, e' stata rilasciata la versione di produzione 15.0 [NdA 2022-10-13]: ecco quindi pubblicato anche questo documento!

In generale la versione 15 e' un'evoluzione della versione precedente con nuove funzionalita' (eg. MERGE, FOR ALL in logical replication) ma anche con migliori prestazioni ed una costante attenzione al miglioramento della sicurezza dei dati.

In questo documento sono riportati in dettaglio i principali nuovi elementi introdotti nella versione 15 riportando esempi pratici di utilizzo:

Ma le novita' non sono solo queste... continuate a leggere!

MERGE

Il nuovo comando di MERGE consente, con un unico comando SQL, di eseguire istruzioni di INSERT, UPDATE, DELETE su una tabella di destinazione partendo dai dati di una tabella sorgente.

Si tratta di una tipica funzionalita' richiesta da applicazioni batch o eseguita da ETL che in precedenza non poteva essere eseguita con un comando unico.

MERGE INTO forno f
  USING ordini o
  ON o.tipo_pizza = f.tipo_pizza
  WHEN MATCHED AND o.quantita+f.numero>0
    THEN UPDATE SET f.numero = f.numero + o.quantita
  WHEN MATCHED AND o.quantita+f.numero<=0
    THEN DELETE
  WHEN NOT MATCHED 
    THEN INSERT (tipo_pizza, numero)
         VALUES (o.tipo_pizza, o.quantita);

E' utile ricordare che la funzionalita' di UPSERT era gia' stata introdotta in PG 9.5 con la clausola ON CONFLICT della INSERT, ma lo statement di MERGE prevede piu' possibilita'.

Logical Replication

Sono molto importanti le nuove funzionalita' introdotte in PG15 per la logical replication.

ALL TABLES IN SCHEMA introduce la possibilita' di pubblicare tutte le tabelle di uno schema. Questo risulta terribilmente comodo quando si utilizza la replica logica per la migrazione di uno schema perche' in precedenza era necessario dichiarare ogni singola tabella. Altro caso di utilizzo e' quello di utilizzare su uno schema con tutte le tabelle dell'anagrafica "aziendale": dopo la creazione una nuova tabella sara' subito disponibile a tutti i sottoscrittori. L'istruzione infatti vale anche per il futuro ovvero anche per le tabelle inserite nello schema dopo la creazione della pubblicazione.

Altra importante novita' della versione 15 e' quella di filtrare le colonne e/o le righe da pubblicare. In questi casi i vantaggi sono sia prestazionali che di sicurezza/visibilita' dei dati.

CREATE PUBLICATION p1
   FOR TABLE customer(customer_id, first_name, last_name, email_list)
 WHERE (active = 1);

Nell'esempio la pubblicazione filtra sia le colonne che verranno distribuite che pone una condizione sulle righe trattate.

Nuove regular expressions

Con la versione 15 sono state introdotte nuove funzioni per il controllo delle regular expression: regexp_count(), regexp_instr(), regexp_like(), regexp_substr() inoltre e' stata e' stata estesa la regexp_replace().

Un esempio lo farei volentieri... se sapessi usare le regular expressions!

select regexp_count(emails_list, '[^@, ]+@[^@, ]+\.[^@, \.]{2,}')
  from customer;

Con questa select viene calcolato il numero di email valide contenute nel campo emails_list... almeno spero!

security_invoker in views

E' stata aggiunta in PG15 la possibilita' di indicare che i privilegi di accesso quando viene applicata la vista non siano quelli dell'utente proprietario della vista ma quelli dell'utente che la esegue.
La sintassi e' molto semplice:

CREATE VIEW customer_v
    WITH ( security_invoker=true )
    AS SELECT *
         FROM customer
        WHERE valid=1
    WITH CHECK OPTION:

Questo aggiunge un'ulteriore possibilita' di controllo dei privilegi degli utenti nell'utilizzo delle viste.

I controlli di sicurezza di PostgreSQL sono molto sofisticati... per le viste gia' erano presenti le opzioni security_barrier [NdA 9.2] e check_option [NdA 9.4]. Mentre per le funzioni e' possibile indicare l'esecuzione come SECURITY ONWER oppure SECURITY DEFINER [NdA 8.1].
Le differenze tra queste opzioni sono sottili ma importanti...

Logging JSON

Nel parametro log_destination e' ora possibile indicare il formato jsonlog [NdA oltre ai classici formati stderr, csvlog e syslog]. Il formato JSON e' utile per analizzare i log da programma; nelle versioni precedenti era necessario utilizzare il formato csvlog quando il log doveva essere trattato.
La configurazione nel file postgresql.conf e' molto semplice:

log_destination = 'jsonlog' 

Non sono le uniche modifiche al logging presenti in PG15. Sono stati cambiati anche alcuni default: ad esempio log_autovacuum_min_duration era impostato per default a -1 (nessun logging delle attivita' di autovacuum) ed ora e' impostato a 10m, una configurazione utile per sapere se le attivita' di autovacuum cominciano ad essere significative; e' stato cambiato il default del parametro log_checkpoints che ora e' impostato a true.

Queste variazioni rendono piu' semplice diagnosticare problemi ed eseguire il tuning del database analizzando i log di PostgreSQL [NdA come fanno sempre piu' spesso le AI che vogliono sostituire noi vecchi DBA].

Varie ed eventuali

Non sono solo quelle riportate fino ad ora le uniche variazioni importanti della versione 15 di PostgreSQL. Altre novita' interessanti sono:

Avro' dimenticato qualcosa? Certamente si!
Ecco il contenuto della matrice delle nuove funzionalita' di PostgreSQL 15:
"jsonlog" logging format, Server statistics in shared memory, UNIQUE NULLS NOT DISTINCT, MERGE, range_agg range type aggregation function, regexp_count, regexp_instr, regexp_like, ALTER TABLE ... SET ACCESS METHOD, Improved performance for sorts exceeding working memory, Improved window function performance, Parallel "SELECT DISTINCT", SECURITY INVOKER views, ALTER SUBSCRIPTION ... SKIP, Logical replication column lists, Logical replication publish all tables in schema, Logical replication row filtering, Logical replication subscriber can disable on error, Archive modules, lz4 and Zstandard (zstd) compression for WAL full page writes, pg_basebackup client decompression, pg_basebackup server-side compression, Pre-fetch WAL during recovery, postgres_fdw parallel commit, Default ICU collations for clusters/databases, psql \dconfig, pg_walinspect.
Non c'e' solo questo: l'elenco completo riportato dalla documentazione ufficiale e l'ottimo prospetto riassuntivo di pgPedia.

In realta' manca ancora qualcosa, perche' non c'e' proprio nella versione 15... l'annunciato full SQL/JSON (presente al freeze della release e praticamente fino all'ultimo momento [NdA 2022-09-01]) e' stato rimosso dai sorgenti.
Speriamo di rivederlo nella 16. PostgreSQL ha gia' un notevole supporto del JSON: il datatype JSON e' stato introdotto nella 9.2 (2012-09) ed ogni versione ha aggiunto nuove funzionalita'. Ma il full SQL/JSON sarebbe stato comodo per i vecchi pigri come me che vogliono utilizzare solo l'SQL [NdE in Oracle il datatype JSON e' presente solo dalla versione 21 (2020-12) che non e' una versione LTS].

PostgreSQL e' in costante evoluzione!
Per il passato... un documento completo con le versioni di tutti prodotti SW che ritengo piu' significativi, ed ovviamente anche di PostgreSQL, e' il tuo server puzza!
Per il futuro... in realta' il futuro di PostgreSQL 16 e' gia' adesso perche' gli sviluppi per la versione 16 sono gia' formalmente iniziati [NdA 2022-07] ed ad aprile 2023 si arrivera' al Feature Freeze in cui vengono fissate le nuove funzionalita' che verranno aggiunte nella versione. Arriveranno quindi le prime Beta e quindi una o piu' RC (Release Candidate) a seconda delle necessita'. Probabilmente entro il 2023-11 la nuova versione PG16 sara' disponibile come produzione [NdA spesso in corrispondenza al secondo giovedi di Novembre, giorno di rilascio delle minor releases, ma sono possibili leggeri anticipi o ritardi per le nuova release].


Titolo: PostgreSQL 15 - Nuove funzionalita'
Livello: Avanzato (3/5)
Data: 13 Ottobre 2022
Versione: 1.0.1 - 31 Ottobre 2022
Autore: mail [AT] meo.bogliolo.name