Nouveautés de PostgreSQL 17

Workshop 17

Dalibo & Contributors

Introduction

  • Développement depuis juin 2023
  • 3 versions beta, 1 version RC
  • Version finale : 26 septembre 2024
  • Actuellement en 17.2
  • Des centaines de contributeurs

Utilisation

Fonction JSON_TABLE()

  • Conversion d’une donnée JSON en vue
  • Clause NESTED PATH

Fonction de conversions entre types JSON

  • Ensemble de fonctions SQL/JSON path pour convertir des valeurs JSON vers d’autres types JSON :
    • .bigint(), .boolean(), .date(), .decimal([precision [, scale]])
    • .integer(), .number(), .string(), .time(), .time_tz(),
    • .timestamp() et .timestamp_tz()

Fonctions JSON(), JSON_SCALAR() et JSON_SERIALIZE()

  • JSON() : convertir une expression au format text en json
  • JSON_SCALAR() : convertir un type de PostgreSQL en type JSON
  • JSON_SERIALIZE() : convertir une expression JSON en text ou bytea

Fonctions JSON_EXISTS(), JSON_QUERY() et JSON_VALUE()

  • JSON_EXISTS() : renvoie vrai si une expression SQL/JSON path renvoie un objet
  • JSON_QUERY() : renvoie l’objet JSON sélectionné par l’expression SQL/JSON path
  • JSON_VALUE() : renvoie le contenu d’un champ de l’objet JSON sélectionné par l’expression SQL/JSON path

Nouvelles possibilités de COPY

  • Deux nouvelles options pour COPY
    • ON_ERROR
    • LOG_VERBOSITY
  • Deux options qui évoluent
    • FORCE_NULL
    • FORCE_NOT_NULL
  • Une nouvelle colonne pour pg_stat_progress_copy

INSERT, colonne IDENTITY et partitionnement

  • Les colonnes IDENTITY sont supportées pour les tables partitionnées
  • Les INSERT sont désormais possibles

Modification de l’expression d’une colonne générée

  • ALTER TABLE ... ALTER COLUMN ... SET EXPRESSION AS
  • Possibilité de modifier l’expression d’une colonne générée
  • Les anciennes valeurs sont régénérées

Génération de nombres aléatoires

  • Nouvelle possibilité d’utilisation de la fonction random
    • bornes min et max

Type interval et valeur infinity

  • Le type interval supporte désormais les valeurs infinity

Contraintes d’exclusion sur les tables partitionnées

  • Les contraintes d’exclusion sont autorisées si elles :
    • incluent toutes les colonnes de la clé de partitionnement
    • n’utilisent que l’opérateur =

Administration

Nouveau fournisseur de collation

  • Fournisseur interne de collation
  • Avantages:
    • portabilité garantie
    • meilleures performances
  • Inconvénients
    • pas de tri linguistique
    • pas de comparaisons avancées

Nouveau rôle pg_maintain et droit MAINTAIN

  • Permettre de gérer les opérations de maintenance sans être propriétaire des tables
  • Rôle pg_maintain
    • droit global pour tous les objets de l’instance
  • Droit MAINTAIN
    • droit par table
  • Opérations de maintenance couvertes
    • VACUUM, ANALYZE, REINDEX
    • REFRESH MATERIALIZED VIEW
    • CLUSTER, LOCK TABLE

Résumés des WAL

  • Nouveau processus en arrière-plan : walsummarizer
  • Fichiers sommaires stockés dans $PGDATA/pg_wal/summaries
  • Nouveaux paramètres
    • activation avec summarize_wal
    • rétention des fichiers avec wal_summary_keep_time
  • Nouvel utilitaire pg_walsummary permettant de consulter le contenu des sommaires

Options –index et –jobs sur reindexdb

  • Plusieurs index sur des tables différentes peuvent être traités en parallèle
  • Options --jobs et --index

Option –all avec vacuumdb et reindexdb

  • Quelques options utilisable avec --all
  • Pour vacuumdb : --table, --schema, --exclude-schema
  • Pour reindexdb : --table, --schema, --index et --system

Support des triggers sur REINDEX

  • Support du mot clé REINDEX sur les event triggers
  • CREATE EVENT TRIGGER ... ON ddl_command_start WHEN TAG IN ('REINDEX')
    • Grâce à cela, il est possible de connaître la liste complète des index sur lesquels un REINDEX a travaillé.

Support des triggers sur connexions

  • Syntaxe
    • CREATE EVENT TRIGGER ... ON LOGIN ...
  • Permet le déclenchement d’une fonction lorsqu’une connexion est réussie
  • Option event_triggers pour activer/désactiver leurs déclenchement
    • intéressant quand la fonction trigger ne fonctionne pas

Nouveau paramètre allow_alter_system

  • Nouveau paramètre allow_alter_system
  • on par défaut
  • Si off : une erreur est retournée si ALTER SYSTEM est utilisé
  • Configurable seulement dans le fichier postgresql.conf

Support des variables personnalisées par ALTER SYSTEM

  • ALTER SYSTEM supporte la modification de GUC inconnu du moteur
  • Très pratique pour la configuration des extensions

Nouveau timeout pour les transactions longues

  • Paramètre transaction_timeout
  • Durée maximale autorisée pour la durée d’une transaction
  • Ne concerne pas les transactions préparées

Nouvelle fonctionnalité pour amcheck

  • Détection dans les doublons des index de contraintes d’unicité
  • Extension amcheck
    • nouveau paramètre checkunique pour bt_index_check et bt_index_parent_check()
  • Outil pg_amcheck
    • nouvelle option --checkunique

Éviction de blocs du cache avec pg_buffercache

  • Nouvelle fonction pg_buffercache_evict(bufferid)
  • Nécessite l’attribut superuser
  • Destinée à la réalisation de tests

Paramètre huge_pages_status

  • Nouveau paramètre huge_pages_status
    • en lecture seule !
  • Vérifie l’allocation des huges_pages (intéressant si huge_pages = try)
  • Valeurs possibles
    • on (huge pages allouées)
    • off (aucune huge page allouée)
    • unknown (information non récupérable)

Sauvegardes

Sauvegardes incrémentales

  • Nouvelle fonctionnalité de sauvegarde incrémentale dans PostgreSQL
    • Commande UPLOAD_MANIFEST pour télécharger le manifeste
    • Commande BASE_BACKUP pour effectuer la sauvegarde

Option --filter pour pg_dump, pg_dumpall et pg_restore

  • Nouvelle option --filter suivie d’un nom de fichier
  • Format des lignes de ce fichier
    • commande objet motifobjet
  • commande vaut
    • soit include pour inclure
    • soit exclude pour exclure
  • objet vaut au choix
    • table_data, index, table_data_and_children, database,
    • extension, foreign_data, function, table, schema,
    • table_and_children ou trigger.
  • motifobjet est une expression rationnelle pour le nom des objets à sélectionner

Autres nouvelles options pg_dump/pg_restore

  • Nouvelle option dans pg_dump
    • --exclude-extension
    • exclut les extensions correspondantes au motif indiqué
  • Nouvelle option pour pg_restore
    • --transaction-size
    • Permet de gagner en performance
    • … tout en évitant les problèmes mémoires si en une seule transaction

Réplication

Failover des slots de réplication logique

  • Option failover
    • pg_create_logical_replication_slot(),
    • CREATE SUBSCRIPTION
  • Synchronisation des slots de réplication
    • pg_sync_replication_slots()
  • Fonction sync_replication_slots
    • automatiser la synchronisation

Nouvelles colonnes pour pg_replication_slots

  • inactive_since
    • depuis combien de temps le slot est-il inactif ?
  • invalidation_reason
    • raison pour laquelle un slot est invalidé

Nouveaux messages des walsenders

  • Ajoute les messages suivants dans les trace lorsqu’un walsender acquiert ou relâche un slot de réplication :
LOG:  acquired logical replication slot "nom-slot"
LOG:  acquired physical replication slot "nom-slot"
LOG:  eleased logical replication slot "nom-slot"
LOG:  released physical replication slot "nom-slot"
  • Nécessite
    • d’activer log_replication_commands
    • ou d’avoir le niveau de trace DEBUG1 actif

Outil pg_createsubscriber

  • Part d’une instance primaire démarrée et une standby arrêtée
  • Met en place les publications, slots et souscriptions
  • Utile pour grosses publications

Supervision

Nouvelle vue pg_stat_checkpointer

  • Nouvelle vue de statistiques sur le checkpointer
  • Auparavant, pg_stat_bgwriter pour les statistiques sur
    • bgwriter
    • checkpointer
  • Maintenant
    • vue pour bgwriter : pg_stat_bgwriter
    • vue pour checkpointer : pg_stat_checkpointer

Nouvelles colonnes pour pg_stat_progress_vacuum

  • indexes_total, nombre d’index à traiter
  • indexes_processed, nombre d’index traités
  • S’incrémentent pendant les phases
    • vacuuming indexes
    • cleaning up indexes

Nouvelles traces d’une recovery

  • Trois nouveaux messages dans les traces
Recovery has started from a backup_label.
Recovery is restarting from a backup start LSN, without a backup_label.
Recovery has completed from a backup.

Nouvelles traces des connexions trust

  • Nouvelle ligne dans les traces
    • log_connections = 'on'
    • Connexions utilisant la méthode trust

Nouvelle vue pg_wait_events

  • Informations sur les wait_events
  • type, name, description

Performance

Regroupement des I/O

  • Un premier pas vers une gestion plus optimale des I/O
  • Vectored I/O, Direct I/O, et Asynchronous I/O
  • Nouveau paramètre io_combine_limit
    • 128 ko par défaut
    • configurable entre 8 ko et 256 ko avec des blocs de taille standard

Suppression de la limite mémoire de VACUUM

  • Configuration de maintenance_work_mem
  • Plus de limite à 1 Go pour le VACUUM

Nouvelles options pour EXPLAIN

  • SERIALIZE
    • temps et la quantité de données retournés au client
  • MEMORY
    • mémoire allouée et utilisée par le planificateur

MergeAppend pour UNION sans ALL

  • UNION sans ALL impose une déduplication des lignes (lourd)
  • Passait uniquement par trois nœuds : Append, Sort puis Unique
  • Peut maintenant utiliser Merge Append suivi d’Unique
  • Permet d’éviter le tri en utilisant des index

Optimisations des CTE

  • Par extraction des statistiques des CTE
  • Par une meilleure information des nœuds précédents sur l’ordre de tri des données de la CTE

Optimisations des clauses IN

  • WHERE c1 IN (... liste de valeurs...)
  • WHERE c1 = ANY (... liste de valeurs...)
  • Syntaxes couramment utilisées mais peu efficaces
  • Avant la v17, N parcours d’index
  • En v17, 1 seul parcours d’index

Meilleure gestion des contraintes NOT NULL

  • Utilisation des contraintes NOT NULL lors de l’optimisation des requêtes
  • Suppression des tests IS NOT NULL pour les colonnes NOT NULL
  • Suppression des parcours avec filtre IS NULL sur les colonnes NOT NULL

Fonctionnement interne

Nouvelle fonctions unicode

  • unicode_version() : version d’Unicode de PostgreSQL
  • icu_unicode_version() : version d’Unicode de ICU
  • unicode_assigned() : tous les caractères d’une chaîne encodée en UTF8 sont-ils des points de code Unicode assignés ?

AT LOCAL

  • Convertit un timestamptz en un timestamp dans le fuseau horaire de la session

Fonction pg_column_toast_chunk_id()

  • Récupérer le numéro de chunk d’une colonne toastée dans la table TOAST

Régressions

  • Paramètres supprimés
    • old_snapshot_threshold
    • trace_recovery_messages
  • Extension supprimée
    • adminpack
  • Fonctionnalité supprimée
    • utilisateur par base (db_user_namespace)

Peut-être pour la prochaine fois ?

Ce qu’on ne trouvera finalement pas dans cette version :

  • SPLIT/MERGE PARTITIONS : faille de sécurité
  • clés primaires temporelles
  • optimisation des auto-jointures

Attention aux articles sur le web !

Questions

Merci de votre écoute !

Nouveautés de la version 17 :

https://dali.bo/workshop17_html

https://dali.bo/workshop17_pdf


  1. avec les direct I/O, le noyau ne fait plus de read-ahead (ça n’aurait pas de sens sans page cache). Le prefetch demandé explicitement par PostgreSQL (avec l’appel système posix_fadvise()), utilisé notamment par analyze, vacuum, et le bitmap heap scan devient impossible lui aussi. Il faut donc un vrai système d’I/O asynchrone pour retrouver de bonnes performances. Une piste en cours de test serait d’utiliser la relativement récente interface noyau io_uring. Une autre piste un peu plus avancée est d’utiliser un background worker dédié pour ces lectures asynchrones.↩︎