Nouveautés de PostgreSQL 16

Workshop 16

Dalibo & Contributors

Introduction

  • Développement depuis l’été 2022
  • 3 versions beta, 1 version RC
  • Version finale : 14 septembre 2023
  • 16.1, le 9 novembre 2023
  • Des centaines de contributeurs

Utilisation

Prédicats IS JSON

  • Support du prédicat IS JSON
  • IS NOT JSON
  • option WITH UNIQUE KEYS

Omission possible de l’alias d’une sous-requête

  • Auparavant, l’alias était obligatoire
SELECT datname, pg_database_size(datname)
FROM (SELECT * from pg_datatase WHERE NOT datistemplate) tmp;
  • Maintenant, c’est optionnel
SELECT datname, pg_database_size(datname)
FROM (SELECT * from pg_datatase WHERE NOT datistemplate);
  • Améliore la lisibilité

Gestion de triggers TRUNCATE sur des tables externes

  • TRUNCATE sur table externe possible
  • Mais pas de trigger sur TRUNCATE pour ce type de table
  • Même gestion que pour une table normale
  • Intérêts
    • audit des opérations sur une table externe
    • interdiction de cette opération

Ajout de fonctions de vérification de types

  • Deux nouvelles fonctions
    • pg_input_is_valid()
    • pg_input_error_info()

Possibilité d’utiliser des tirets bas pour des entiers ou valeurs numériques

  • Utilisation autorisée des _ dans les nombres
  • Améliore la lisibilité
  • 1000000 = 1_000_000

Administration

Ajout de la variable SYSTEM_USER

  • Nouvelle fonction SYSTEM_USER du standard SQL
  • Affiche l’utilisateur système utilisé et la méthode de connexion
  • auth_method:identity
  • Valeur NULL si la méthode trust est utilisée

archive_library et archive_command ne peuvent plus être renseignés en même temps

  • archive_library et archive_command ne peuvent pas être configurés en même temps
  • Une erreur FATAL est renvoyée
  • Avant archive_library prenait le dessus

Réservation de slots de connexion

  • Nouveau rôle pg_use_reserved_connections
    • permet d’utiliser des slots de connexions réservés
  • Nouveau paramètre reserved_connections
    • pour configurer le nombre de slots réservés

Ajout du paramètre scram_iterations

  • Nouveau paramètre scram_iterations
    • détermine le nombre d’itérations à effectuer lors du chiffrement d’un mot de passe avec SCRAM
  • Valeur par défaut
    • 4096

Ajout de la possibilité d’inclure d’autres fichiers ou dossier dans pg_hba.conf et pg_ident.conf

  • Trois nouveaux mots clés dans pg_hba.conf et pg_ident.conf
    • include : un fichier
    • include_if_exists: un fichier s’il existe, l’ignorer autrement
    • include_dir: un dossier
  • Champs file_name dans pg_hba_file_rules et pg_ident_file_mappings
    • permet de savoir d’où est tirée la configuration

Ajout du support des expressions régulières dans le fichier pg_hba.conf

  • Préfixe /
    • rupture avec les versions inférieures
  • Champs concernés : base et utilisateur

Ajout de la gestion des tables enfants et partitionnées dans pg_dump

  • Trois nouvelles options sont disponibles pour pg_dump
    • --table-and-children
    • --exclude-table-and-children
    • --exclude-table-data-and-children
  • Inclusion ou exclusion de partitions lors d’une sauvegarde d’une table partitionnée

lz4 et zstd peuvent être utilisés avec pg_dump

  • Deux nouveaux algorithmes de compression supportés par pg_dump :
    • zstd
    • lz4
  • Option -Z / --compress

Contrôle de l’utilisation de la mémoire partagée par ANALYZE et VACUUM

  • Nouvelle option BUFFER_USAGE_LIMIT
    • VACUUM
    • ANALYZE
  • Nouveau paramètre de configuration
    • vacuum_buffer_usage_limit

Ajout des options --schema et --exclude-schema dans vacuumdb

  • Deux nouvelles options à vacuumdb
    • --schema
    • --exclude-schema

Ajout des options SKIP_DATABASE_STATS et ONLY_DATABASE_STATS

  • Gestion de la mise à jour des statistiques pour VACUUM
  • Nouvelles options de VACUUM
    • SKIP_DATABASE_STATS
    • ONLY_DATABASE_STATS
  • Intégré à vacuumdb
    • SKIP_DATABASE_STATS activé par défaut en v16
    • ONLY_DATABASE_STATS si pas d’ANALYZE par étapes

Optimisation de ANALYZE avec postgres_fdw

  • postgres_fdw
  • ANALYZE plus efficace sur des tables distantes
  • Option analyze_sampling
    • SERVER
    • FOREIGN TABLE

Refonte du système de délégation de droits

  • Améliorations sur le droit ADMIN OPTION
  • Retourne une erreur s’il est réappliqué au donneur du droit
  • REVOKE ADMIN OPTION ... CASCADE

Nouveau paramètre libpq : require_auth

  • Nouveau paramètre de la libpq
    • require_auth
  • Liste de mots clés séparés par une virgule
  • Mots clés
    • password, md5, gss, sspi, scram-sha-256, creds, none

Sélection aléatoire des hosts par libpq

  • Répartiton de la charge de connexions entre plusieurs instances
  • Nouveau paramètre libpq
    • load_balance_hosts=<string>

Réplication

Décodage logique sur les instances secondaires

  • Permet de :
    • créer un slot de réplication logique sur une standby
    • lancer le décodage logique sur une standby (!= réplication logique)
    • souscrire à une publication créée sur le primaire depuis une standby
  • Invalidation du slot de réplication logique en cas de :
    • conflit de réplication : utiliser un slot de réplication physique et le hot_standby_feedback
    • réduction du wal_level sur l’instance principale
  • Nouveau champ confl_active_logicalslot dans pg_stat_database_conflicts
  • Nouveau champ conflicting dans pg_replication_slots

Parallélisme de l’application des modifications

  • Réplication logique
    • parallélisme lors de l’application
    • paramètre streaming d’une souscription

Nouveau role pg_create_subscription

  • Nouveau rôle pg_create_subscription
    • prévenir des failles de sécurité
  • Droit CREATE sur la base de données pour
    • ALTER SUBSCRIPTION .. RENAME
    • ALTER SUBSCRIPTION .. OWNER TO
  • Mot de passe défini et utilisé lors de l’authentification
  • Paramètre de souscription : require_pasword

Performances

Nouvelle option d’EXPLAIN

  • Nouvelle option GENERIC_PLAN
  • Trace le plan générique d’une requête préparée
    • Accepte les placeholders comme $1 ou $2

Plus d’utilisation du Incremental Sort

  • Nœud Incremental Sort utilisé dans plus de cas
  • Notamment pour DISTINCT

Amélioration des agrégats

  • Pour les clauses ORDER BY et DISTINCT dans des agrégats
    • par exemple string_agg(nom, ',' ORDER BY nom)
  • Possibilité d’utiliser
    • parcours d’index
    • tri incrémental

Parallélisation des agrégats string_agg et array_agg

  • Parallélisation possible de ces deux fonctions d’agrégat
  • Comme d’habitude, un Partial Aggregate, suivi d’un Full Aggregate

Parallélisation des FULL OUTER JOIN

  • Nouveau nœud Parallel Hash Full Join
    • parallélisation des FULL OUTER JOIN
    • parallélisation des RIGHT OUTER JOIN
  • Jointure par hachage dans ces deux cas

Supervision

Nouvelle vue pg_stat_io

  • Nouvelle vue de statistiques I/O
  • Compteurs pour chaque combinaison de
    • type de backend ;
    • objet I/O cible ;
    • et contexte I/O.

Horodatage du dernier parcours d’une relation

  • Donne la date et heure du dernier parcours de table et d’index
  • Ajout de deux colonnes pour pg_stat_all_tables
    • last_seq_scan, dernier parcours séquentiel de table
    • last_idx_scan, dernier parcours d’index
  • Ajout d’une colonne pour pg_stat_all_indexes
    • last_idx_scan, dernier parcours d’index

Nombre d’UPDATE

  • Indique le nombre de lignes déplacées dans un autre bloc suite à une mise à jour
  • Ajout d’une colonne pour pg_stat_all_tables
    • n_tup_newpage_upd
  • Permet d’estimer les bons candidats à la configuration du fillfactor

Amélioration de pg_stat_statements

  • Normalise la requête indiquée dans les ordres :
    • DECLARE
    • EXPLAIN
    • CREATE MATERIALIZED VIEW
    • CREATE TABLE AS
  • Par exemple
CREATE TABLE pgss_ctas AS SELECT a, $1 b FROM generate_series($2, $3) a;
DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT $1;

Amélioration de auto_explain

  • Trace le queryid en mode VERBOSE
  • Gère le paramètre log_parameter_max_length

Régression

Disparition des variables LC_COLLATE et LC_CTYPE

  • Suppression des variables en lecture seule :
    • lc_collate
    • lc_ctype

Autres régressions

  • Paramètres supprimés
    • vacuum_defer_cleanup_age
    • promote_trigger_file
  • Paramètre renommé
    • force_parallel_mode devient debug_parallel_query

Questions ?

Merci de votre écoute !

Nouveautés de la version 16 :

https://dali.bo/workshop16_html

https://dali.bo/workshop16_pdf