Nouveautés de PostgreSQL 18

Workshop 18

Dalibo & Contributors

Introduction

  • Développement depuis juin 2024
  • Version finale : Septembre 2025
  • Actuellement en v 18.3
  • Des centaines de contributeurs

Utilisation

Gestion des UUID v7

  • Fonction de génération des UUID v7 : uuidv7()
    • début généré à partir d’un timestamp
    • assure la colocalité des données dans les index B-tree
  • Fonctions d’extraction :
    • uuid_extract_version()
    • uuid_extract_timestamp()

Colonnes générées virtuelles : présentation

ALTER TABLE paquets
ADD COLUMN volume int GENERATED ALWAYS
        AS ((longueur * hauteur * largeur))  VIRTUAL ;
  • Les colonnes générées virtuelles
    • sont recalculées à chaque appel
    • ne prennent pas de place
    • ne nécessitent pas une réécriture de la table
    • sont facilement modifiables

Colonnes générées virtuelles : limites

  • Limites sur les colonnes utilisables
  • Limites sur les fonctions utilisables
  • Limites sur l’indexation
  • Limites sur les statistiques
  • Limites sur les clés étrangères
  • Limites sur la réplication logique

Comparaison entre colonnes générées stockées et virtuelles

Critère Stockées Virtuelles
PostgreSQL minimum 12 18
Fonctions utilisables Immutables Immutable et système (pas d’utilisateur)
Fonctions utilisateur Oui Non
Place sur le disque Oui Aucune
Réécriture de la table Création + modification Non
Statistiques Oui Non (*)
Indexables Oui Non (*)
Clés étrangères Oui Non
Réplication logique >=18 (sur demande) Jamais

(*) sauf indirectement via la définition d’autres objets

Clé temporelles

  • Interdit les recouvrements de période
ALTER TABLE reservations
ADD CONSTRAINT periodes_ne_se_recouvrent_pas
UNIQUE (salle, periode WITHOUT OVERLAPS);
  • Clés primaires et étrangères possibles
  • Extension btree_gist généralement nécessaire
  • Était déjà partiellement possible avec des contraintes d’exclusion

Ajout des pseudo tables OLD/NEW pour RETURNING

  • Clause RETURNING disponible depuis la 8.2
  • Mais manquait la possibilité d’accéder aux anciennes valeurs
  • Manque corrigé en v18
  • Pseudo table OLD pour les anciennes valeurs
  • Pseudo table NEW pour les nouvelles valeurs

Améliorations de COPY

  • Nouvelle option reject_limit
  • Nouvelle valeur silent pour l’option log_verbosity
  • Possibilité de copier à partir de vues matérialisées

psql - Requêtes préparées nommées

  • Nouvelles métacommandes :
    • \parse, \bind_named et \close.
  • Principalement destinées aux tests de non régression

psql - Mode pipeline

  • Nouvelles métas commandes :
    • \startpipeline, \endpipeline, \syncpipeline, \flush, \flushrequest, \getresults et \sendpipeline
  • Nouvelles variables :
    • PIPELINE_SYNC_COUNT, PIPELINE_COMMAND_COUNT, PIPELINE_RESULT_COUNT
  • Statut du pipeline dans le prompt avec %P ( on, off, abort)
  • Principalement destinés aux tests de non régression
  • Permet de convertir un script en mode pipeline

psql - Autres améliorations

  • Nom de service :
    • %s : nouvelle variable de prompt
    • SERVICE : nouvelle variable d’environnement de psql
  • La plupart des métacommandes de liste ont désormais une option \x
  • \conninfo affiche désormais un tableau
  • Informations sur la caractéristique leakproof des fonctions, opérateurs et casts
  • \dP+ affiche désormais la méthode d’accès associée à une table partitionnée
  • \dx affiche désormais la version par défaut des extensions
  • \watch : temps d’attente configurable avec WATCH_INTERVAL

Administration

Nouvelle méthode d’authentification oAuth

  • Méthode oauth
  • Nécessite
    • un fournisseur d’identité ou IdP (OAuth2 ou OIDC)
    • un module de validation côté serveur
    • un client PostgreSQL connaissant cette méthode
  • Module de validation
    • paramètre oauth_validator_libraries
    • un module OIDC en cours d’écriture par Percona

Activation par défaut des sommes de contrôle

  • Activation des sommes de contrôle par défaut dans initdb
  • Nouvelle option --no-sync-data-files

Nouveau rôle pg_signal_autovacuum_worker

  • But du rôle pg_signal_backend
    • arrêter une requête ou une connexion
    • … mais juste pour les processus du même rôle
    • … donc pas pour autovacuum
  • Nouveau rôle pg_signal_autovacuum_worker
    • permet à un utilisateur d’arrêter un autovacuum

Changement sur les paramètres de traces

  • Transformation de log_connections en liste
    • receipt, authentication, authorization, setup_durations
    • all
    • on et off toujours acceptés
  • Modification de la trace des connexions
    • contient les durées d’établissement de la connexion si setup_durations
  • Nouveau paramètre log_lock_failures
    • trace les échecs de demande de verrou
  • Nouveau joker %L pour log_line_prefix pour les IP

Améliorations sur l’autovacuum

  • Possibilité de modifier autovacuum_max_workers sans redémarrer PostgreSQL
    • seuil maximum : nouveau paramètre autovacuum_worker_slots (16)
  • Vacuum plus fréquent des très grandes tables
    • nouveau paramètre autovacuum_vacuum_max_threshold

Améliorations sur les outils - 1

  • vacuumdb
    • nouvelle option --missing-stats-only
  • pg_combinebackup
    • Nouvelle option -k/--link
  • pg_verifybackup
    • vérifier les sauvegardes au format tar (compressées ou non)
    • requiert l’option -n/--no-parse-wal

Améliorations sur les outils - 2

  • pg_bench
    • affiche désormais les erreurs de sérialisation et deadlock dans ses rapports.
  • pg_createsubscriber
    • --all, --clean=publication, --enable-two-phase, --enable-failover
  • pg_rewind
    • amélioration de --write-recovery-conf pour les failover slots

Évolutions de pg_dump/pg_dumpall/pg_restore

  • pg_dump, pg_dumpall et pg_restore :
    • --no-data, -no-schema
    • --no-policies
  • pg_dump et pg_dumpall :
    • --sequence-data

Gestion des statistiques par pg_dump/pg_dumpall/pg_restore

  • Nouvelles options
    • --statistics
    • --statistics-only, --no-statistics
  • Pas par défaut !
  • Pas les statistiques étendues

pg_upgrade

  • Préservation des statistiques sur les données
    • --no-statistics
  • Parallélisation des contrôles : --jobs
  • Nouvelle stratégie de transfert des données : --swap
  • Compatibilité entre architectures : --set-char-signedness (x86/arm)

Nouveau paramètre extension_control_path

  • Nouveau paramètre extension_control_path
  • Emplacements supplémentaires pour les extensions

Réplication

Invalidation des slots de réplication basée sur le temps d’inactivité

  • Nouveau paramètre idle_replication_slot_timeout
  • Invalidation basée sur la durée d’inactivité
  • Exprimé en minute
  • Réplication physique et logique

Réplication logique - Publication des colonnes générées stockées

  • Les colonnes GENERATED ALWAYS AS () STORED sont publiées si :
    • les colonnes sont dans la liste des colonnes spécifiées
    • ou : publish_generated_columns = stored (defaut : none)
  • Les colonnes générées présentes dans l’identité de réplication doivent être répliquées.
  • Colonne virtuelles (v18) : jamais exportées

Réplication logique - Limiter le nombre de souscriptions

  • Nouveau paramètre max_active_replication_origins
  • Nombre maximal d’origines de réplication actives sur un serveur
  • Limite le nombre de souscriptions et de table sync workers
  • Précédemment limité par max_replication_slots
  • Configuré à 10 par défaut

Réplication logique - Conflits de réplication

  • Détection de 7 types de conflits de réplication logique
  • 7 nouvelles colonnes dans pg_stat_subscription_stats
    • comptabilise les types de conflits
  • Nouveaux messages d’informations et d’erreurs associés

Performances

AsyncIO

  • IO asynchrones
    • PostgreSQL connaît mieux le contexte que l’OS
    • 15: recovery_prefetch
    • 16: extension des relations
    • 17: infrastructure pour combiner des IO (io_combine_limit)
    • 18: infrastructure pour les IO asynchrone (io_method)
  • De gros gains
    • Bitmap Scan en premier lieu
    • en lecture uniquement
  • Direct IO (pas “encore” disponible)
    • 16: debug_io_direct

AsyncIO - Nouveaux paramètres

Paramètre Défaut Remarque
io_combine_limit 128 ko
io_max_combine_limit 128 ko
io_max_concurrency -1 Souvent 64
io_method worker ou io_uring,sync
io_workers 3 jusque 32
  • io_method = worker à priori un bon défaut
  • io_workers sans doute à monter

AsyncIO - Nouvelles vues et wait events

  • Nouvelle vue pg_aios :
    • IO en cours, taille, handle
  • Nouveaux wait events
    • ex : AioIoCompletion

Création parallélisée des index GIN

  • Parallélisation de la construction des index GIN
    • enfin !
  • max_parallel_maintenance_workers = 2 (défaut)
    • on peut augmenter un peu, gain non linéaire.

Amélioration du mécanisme fast-path locking

  • Le mécanisme fast-path locking est amélioré
  • Plus de verrous peuvent être posés via ce mécanisme
  • Configurable via max_locks_per_transaction (64 par défaut)
  • Limite dure à 16 384 verrous (contre 16 auparavant)
  • Profite aux workloads de type OLTP avec tables partitionnées

Améliorations sur la commande EXPLAIN

  • Affichage amélioré des nœuds désactivés
  • Option BUFFERS
    • inclus par défaut
  • Option WAL
    • ajout de l’information buffers full
  • Ajout du nombre de recherches dans l’index
    • nouvelle ligne Index searches
  • Affichage du nombre de lignes en fractionnel
  • Ajout des informations d’utilisation mémoire et disque
  • Ajout d’informations sur les arguments des fonctions de fenêtrage
  • Ajout de statistiques sur le cache du worker parallélisé d’un Bitmap Heap Scan

Optimiseur

Skip scan pour index B-Tree

-- Index sur 2 colonnes
CREATE INDEX ON matable (c1 , c2);
-- critère sur la 2è colonne
SELECT * FROM matable WHERE c2 =
  • Avant v18 : lecture de tout l’index… voire Seq Scan
  • v18 : pour chaque c1, cherche la bonne valeur de c2
  • Suppose : c1 de faible cardinalité
  • Économie d’index

Suppression automatique de jointures inutiles

  • Jointure d’une table avec elle-même
    • automatiquement supprimée
  • Cette problématique arrive facilement
  • 6 ans de discussion pour le patch !

Conversion de clauses OR en tableau

  • OR converti si possible en ANY et tableau
  • Ces clauses donnent enfin le même plan :
WHERE a = 1 OR a = 2 OR a = 3
WHERE a IN (1,2,3)
WHERE a = ANY ('{1,2,3}')
  • Évite des accès et des BitmapOR

Supervision

Vues de supervision

  • pg_stat_database
    • nouvelles colonnes parallel_workers_to_launch et parallel_workers_launched
  • pg_stat_all_tables
    • plusieurs colonnes indiquant le temps passé sur les opérations VACUUM et ANALYZE
  • pg_stat_io
    • indique l’activité en octets (et non en blocs)
    • indique l’activité sur les journaux de transactions
    • track_wal_io_timing à activer pour avoir les durées
  • pg_stat_wal
    • suppressions des colonnes read et sync
  • pg_stat_checkpointer
    • nouvelles colonnes num_done et slru_written

Informations sur le VACUUM et l’ANALYZE

  • Délai suite à un dépassement de coût
    • nouvelle colonne delay_time dans pg_stat_progress_vacuum
    • nouvelle colonne delay_time dans pg_stat_progress_analyze
    • trace supplémentaire avec l’option VERBOSE
  • Trace supplémentaire sur les WAL
    • buffers full

Statistiques sur les I/O par backend

  • Deux nouvelles fonctions
    • pg_stat_get_backend_io()
    • pg_stat_reset_backend_stats()
  • Expose des données similiaires à pg_stat_io
  • Pour les backends clients, processus auxilaires, le WAL writer, le WAL receiver et le WAL summarizer

pg_stat_statements

  • Normalisation des commandes SET
  • Traçage des sous-requêtes de DECLARE CURSOR et CREATE TABLE AS
  • Nouvelles colonnes dans pg_stat_statements
    • parallel_workers_to_launch : workers demandés par le planificateur
    • parallel_workers_launched : workers effectivement lancés
    • wal_buffers_full : nombre de fois que le WAL buffer s’est rempli

Questions

Merci de votre écoute !

Nouveautés de la version 18 :

https://dali.bo/workshop18_html

https://dali.bo/workshop18_pdf


  1. Direct IO↩︎

  2. Direct Memory Access↩︎

  3. Async IO↩︎