Les nouveautés de Postgres 19 : analyse approfondie de la bêta
(snowflake.com)- Une bêta riche en améliorations sur tous les fronts — requêtes de graphes de propriétés SQL, réplication logique,
VACUUM, performances, etc. — avec l’intégration native dans le cœur deREPACK CONCURRENTLYpour les grandes bases de données de production - La prise en charge de la fusion et de la division des partitions, ainsi que la synchronisation des valeurs de séquence, facilitent nettement les changements de conception et les déplacements de données en exploitation
- L’autovacuum introduit des workers parallèles et un système de scores de priorité, améliorant le débit et la visibilité des tâches de maintenance
- L’arrivée de SQL/PGQ permet d’interroger des données existantes sous forme de graphe sans abandonner le modèle relationnel
- Plus qu’une fonctionnalité phare isolée, c’est surtout la largeur du périmètre qui ressort, avec des progrès simultanés sur les applications, l’exploitation, les performances et l’extensibilité
Intégration native de REPACK
- Dans les environnements exploités de longue date, le besoin de récupérer le bloat des tables, de réécrire une table ou de réorganiser les données sans subir les verrous de
VACUUM FULLouCLUSTERrevient régulièrement- Un écosystème d’extensions existait déjà pour répondre à ce problème, notamment
pg_repack, qui comblait ce manque
- Un écosystème d’extensions existait déjà pour répondre à ce problème, notamment
- Postgres 19 introduit la commande
REPACKdans le cœur, avec prise en charge deREPACK CONCURRENTLY- Cette fonctionnalité devrait intéresser davantage les utilisateurs en production que ne l’imaginent les lecteurs habituels des notes de version
Une partitionnement plus pratique
- Postgres 19 ajoute la prise en charge de la fusion et de la division des partitions
- Les stratégies de partitionnement sont choisies avec des informations imparfaites, et quand la charge, la durée de rétention ou le rythme de croissance des données changent, certaines partitions peuvent devenir trop grosses ou trop petites
- Le fait de pouvoir fusionner et diviser laisse la possibilité de faire évoluer la conception dans le temps sans tout reconstruire depuis le début
- Fusion de partitions Q1 et Q2 en une seule partition :
ALTER TABLE customer_orders MERGE PARTITIONS (orders_2026_q1, orders_2026_q2) INTO orders_2026_h1; - Un exemple de
SPLIT PARTITIONest également donné pour découper une partition Q3 au mois
- Fusion de partitions Q1 et Q2 en une seule partition :
La maturité de la réplication logique
- La réplication logique est utile pour les migrations, les mises à niveau, les systèmes de reporting, les déplacements de données, la réplication sélective, la haute disponibilité et les workflows d’exploitation
- L’amélioration la plus importante est la synchronisation des valeurs de séquence, qui aligne mieux l’abonné sur l’éditeur
- Sans réplication de l’état des séquences, les données sont bien transférées, mais le prochain ID généré peut se désaligner après le cutover
- La publication prend désormais en charge
ALL SEQUENCES, le signalement des erreurs de synchronisation de séquence et un meilleur comportement lors des actualisations d’abonnement liées aux séquences
- Il devient possible d’utiliser la clause
EXCEPTpour publier toutes les tables tout en en excluant certaines wal_level = replicaactive automatiquement la réplication logique si nécessaire, et le nouveaueffective_wal_levelindique le comportement réellement appliqué, ce qui réduit les erreurs de configuration et améliore la visibilité
Un autovacuum plus intelligent et plus visible
- L’autovacuum peut utiliser des workers de vacuum parallèles, avec un contrôle global et par table
- Exemple de configuration globale :
ALTER SYSTEM SET autovacuum_max_parallel_workers = 4;
- Exemple de configuration globale :
- Un nouveau système de scores pour déterminer l’ordre dans lequel les tables sont vacuumées améliore la priorisation des tables les plus urgentes
- Exemple d’ajustement du poids par table : urgence de vacuum basée sur les insertions à 3.0, urgence de vacuum classique update/delete à 0.5
- La nouvelle vue
pg_stat_autovacuum_scoresrend visible le processus de décision- Des détails supplémentaires dans les vues de progression de vacuum et d’analyse, l’usage mémoire et le parallélisme dans
VACUUM VERBOSEet les logs d’autovacuum, ainsi qu’unlog_autoanalyze_min_durationdédié renforcent l’observabilité de la maintenance
- Des détails supplémentaires dans les vues de progression de vacuum et d’analyse, l’usage mémoire et le parallélisme dans
Arrivée des requêtes de graphes de propriétés SQL
- Ajout de SQL/PGQ (SQL property graph queries)
- Les charges de travail où le modèle sommet/arête est utile incluent la détection de fraude, les recommandations, l’analyse réseau, les graphes de permissions, la supply chain ou les organigrammes
- Exemple de définition de graphe de propriétés :
CREATE PROPERTY GRAPH store_graphavec spécification de VERTEX TABLES et EDGE TABLES
- L’idée n’est pas d’abandonner le modèle relationnel, mais d’ajouter une autre manière d’interroger des données déjà présentes
- Cela s’inscrit dans la même logique que JSONB, la recherche plein texte ou les extensions, qui n’imposaient pas de changer d’architecture existante
- Du point de vue des développeurs, cela permet d’utiliser des requêtes de type graphe sans ajouter un datastore séparé, un chemin de synchronisation, une surface d’exploitation supplémentaire ou un nouveau sujet de debug à 2 heures du matin
Un COPY plus utile
COPY FROMprend désormais en charge le saut de plusieurs lignes d’en-tête- Utile pour traiter des CSV exportés par des fournisseurs, des outils internes ou d’autres sources avec des métadonnées supplémentaires en tête
COPY FROMajouteON_ERROR SET_NULL, qui remplace les valeurs d’entrée invalides par null, offrant une alternative entre « tout l’import échoue » et « nettoyage préalable obligatoire »- Un exemple est donné pour charger un fichier où la colonne price contient des valeurs comme 'N/A' et 'MISSING'
COPY TOpeut désormais produire du JSON, y compris un tableau JSON unique, et exporter directement des tables partitionnées (alors qu’auparavant il fallaitCOPY (SELECT ...))- Exemple d’export d’une table vers un tableau JSON valide :
WITH (FORMAT JSON, ARRAY true)
- Exemple d’export d’une table vers un tableau JSON valide :
Améliorations de confort côté SQL
GROUP BY ALLgroupe automatiquement les expressions de la liste cible qui ne sont ni agrégées ni des fenêtres, ce qui rend les SQL exploratoires et les requêtes de reporting plus propres- Les fonctions de fenêtre prennent en charge
IGNORE NULLSetRESPECT NULLSpourlead,lag,first_value,last_valueetnth_value - L’ajout de
INSERT ... ON CONFLICT DO SELECT ... RETURNINGpermet de renvoyer plus directement la ligne en conflit dans les upserts UPDATEetDELETE FOR PORTION OFpoursuivent la prise en charge des opérations temporelles, avec notamment l’extension des fonctions temporellesRANDOM()
Des gains de performance généralisés
- Le planificateur et l’exécuteur progressent sur de nombreux points : anti-join, semi-join, constant folding, tri incrémental sur les chemins append, agrégations avant jointure, calcul de sélectivité des jointures, statistiques sur les fonctions, etc.
- Postgres évolue pour mieux reconnaître les formes courantes de requêtes et réduire le travail inutile
- Certaines agrégations peuvent être réalisées avant la jointure, réduisant le nombre de lignes traitées
- Davantage de cas de
NOT INetLEFT JOINsont transformés en anti-join efficaces - Meilleure visibilité de Memoize dans
EXPLAIN, amélioration du tri avec radix sort, contrôles de clés étrangères plus rapides, et utilisation d’instructions SIMD pour les entrées texte et CSV deCOPY FROM
- Dans de nombreux cas, une simple mise à niveau suffit pour obtenir un meilleur comportement sans modifier le code applicatif
Pourquoi Postgres 19 est important
- Ce n’est pas une fonctionnalité unique qui se démarque, mais bien la largeur du périmètre
- Pour les développeurs d’applications : requêtes de graphe, syntaxe SQL enrichie, améliorations des fonctions de fenêtre, meilleur comportement des upserts
- Pour les opérateurs :
REPACK CONCURRENTLY, autovacuum amélioré, monitoring renforcé, changement de checksum en ligne, visibilité accrue sur la réplication - Pour les utilisateurs focalisés sur les performances : améliorations du planificateur, SIMD, visibilité sur l’I/O asynchrone, contrôles de clés étrangères plus rapides, tri amélioré
- Pour ceux qui construisent sur Postgres : nouveaux hooks, module de conseil au planificateur, améliorations des extensions, récupération des statistiques FDW, poursuite des investissements dans l’écosystème d’extensions
- Il ne progresse pas seulement pour une charge de travail ou un persona donné, mais simultanément comme base de données et plateforme pour les applications, l’exploitation, l’analyse et l’extension
- Ce n’est pas encore une version GA, donc c’est le bon moment pour tester : exécuter les applications, valider les migrations, vérifier les extensions, examiner les plans des requêtes clés et passer en revue les workflows de réplication logique et de maintenance
1 commentaires
Commentaires sur Hacker News
J’ai utilisé Postgres, Oracle, MS SQL Server et MySQL dans des projets réels, et même si je n’ai pas utilisé SQLite en profondeur, je sais que c’est une excellente option.
Aujourd’hui, pour mes propres besoins, j’évite systématiquement Oracle et MySQL/MariaDB.
Postgres est excellent, mais j’aimerais qu’il dispose de connexions légères et de vues matérialisées mises à jour de manière synchrone. Même si les poolers de connexions améliorent la situation, l’usage mémoire par connexion concurrente reste anormalement élevé, et une fonctionnalité comme les vues indexées de SQL Server permet, dans des contextes de données complexes, des implémentations élégantes, triviales et toujours correctes.
SQL Server peut être coûteux, mais dans beaucoup de cas il vaut son prix, et choisir soigneusement son entrepôt de données permet d’éviter beaucoup de futurs maux de tête.
Si l’on veut utiliser une option gratuite, il est difficile de faire mieux que SQLite, qui couvre aujourd’hui la plupart des cas d’usage. En revanche, il commence à montrer ses limites côté sauvegarde, réplication et outillage. Si je dois être responsable de la disponibilité du système et de la reprise après sinistre, cela ne me dérange pas de payer pour réduire le risque.
Si je dois payer ne serait-ce qu’un peu, autant aller jusqu’au bout. L’expérience développeur autour de MSSQL est sans équivalent, et je trouve que SSMS et les projets SQL de Visual Studio sont largement meilleurs que les solutions de type Entity Framework actuelles. Avec des outils tiers comme ceux de RedGate, on peut remplacer des packages de consulting à plusieurs millions de dollars.
Je ne proposerais pas de déployer un nouveau serveur Oracle ou DB2, mais s’il en existe déjà un, je m’opposerais jusqu’au bout à une refonte visant à s’en débarrasser. Ces bases de données s’accompagnent généralement d’une énorme quantité d’histoires d’horreur, et tenter de reproduire leurs effets de bord bizarres dans un nouveau moteur peut, faute d’autre option, casser l’activité elle-même.
En tant que DBA, quand on fait beaucoup de travaux DBA lourds, Postgres joue dans une autre catégorie que SQL Server. Postgres est natif Linux et open source, donc en matière de flexibilité, d’observabilité interne et d’exploitation, SQL Server ne soutient pas la comparaison.
Dans le paysage technologique actuel, je considère SQL Server comme pratiquement mort. Les entreprises qui l’utilisent sont surtout des organisations legacy centrées sur Windows, et elles sont de moins en moins nombreuses.
Ce serait aussi bien d’avoir une option de rafraîchissement différé. L’idée serait de traiter plusieurs mises à jour en une seule fois en ne prenant en compte que les enregistrements modifiés depuis le dernier rafraîchissement, même si je ne sais pas exactement comment Oracle le fait techniquement. Cette fonctionnalité serait un ajout fantastique par rapport à presque toutes les bases OLTP open source.
Le projet OrioleDB m’intrigue aussi beaucoup : https://github.com/orioledb/orioledb/releases
Il y a quelques années, j’ai pas mal souffert à cause du vacuum, avec beaucoup d’insertions et de suppressions aléatoires continues dans une sorte de table temporaire. J’ai résolu le problème en accumulant davantage de changements en RAM avant de les flusher dans la table afin d’augmenter le nombre de lignes modifiées par page, mais trouver le bon équilibre a été très pénible.
Ayant utilisé Postgres pendant plus de 15 ans dans le domaine scientifique, je commence à m’inquiéter de l’absence de stockage orienté colonnes dans PostgreSQL.
À mesure que les jeux de données grossissent, les limites du stockage de PG se font de plus en plus sentir. Plusieurs extensions comme cetus peuvent fournir cette fonctionnalité, mais on devient alors dépendant de la prise en charge future de l’extension, tout en augmentant la complexité.
Au départ, je pensais qu’utiliser des tables Postgres comme stockage et l’exécuteur Postgres introduirait trop de surcharge intrinsèque, et qu’égaler les performances de Timescale serait déjà assez impressionnant. Je ne pensais pas qu’on pourrait se rapprocher d’une base de données analytique dédiée.
Mais à mesure que le projet avançait, les performances ont continué à s’améliorer, et je suis désormais clairement favorable à l’idée de faire de l’analytique avec Postgres + une extension.
C’est un peu comme s’inquiéter qu’Apple ne vende pas de machines à laver.
De nos jours, beaucoup d’entreprises utilisent aussi, dans leur application principale, une base clé-valeur ou un stockage documentaire en complément d’une base relationnelle.
Je ne comprends pas pourquoi il n’a pas été question du fait que PostgreSQL 19 introduit la prise en charge native des données temporelles application-time fondée sur le standard SQL:2011 : https://www.depesz.com/2026/04/02/waiting-for-postgresql-19-...
_archive: https://www.postgresql.org/docs/current/tcn.htmlSi ça devient natif, ce sera probablement excellent, comme la plupart des implémentations PostgreSQL
https://news.ycombinator.com/item?id=48413655
Je n’arrive pas à savoir si cet article emploie un style surreprésenté dans les données d’entraînement des LLM, ou s’il a été beaucoup retravaillé avec l’IA. Je penche pour la seconde hypothèse
Quand Claude écrit des phrases du genre « en tant que personne qui fait X depuis longtemps », j’y vois une forme d’échec d’alignement. Un LLM ne devrait pas écrire comme s’il avait une expérience personnelle. Des humains ont peut-être parlé ainsi dans les données d’entraînement, mais même s’il s’agit d’une séquence de tokens statistiquement plausible, je pense qu’un LLM ne devrait pas revendiquer des expériences de vie qu’il n’a pas
J’aime bien les améliorations de COPY et de la réplication logique. Actuellement, je sauvegarde ma base PG dans une instance Databasus en side-car, et celle-ci est plus lourde que tout le backend + la DB + Caddy
Ce qui suit est une plainte sur le style LLM
À lire des phrases comme « Cela suffit à le montrer : les utilisateurs avaient un vrai besoin, et l’écosystème a comblé ce vide », « Cela paraît simple, mais résout de vrais problèmes d’exploitation », « Cela ne change pas le monde, mais améliore les workflows de données du quotidien », si Orwell était encore en vie, il aurait peut-être déclaré son analphabétisme en anglais et appris le klingon
Les fonctionnalités de base de données graphe ont l’air intéressantes, mais la syntaxe
GRAPH_TABLEest vraiment atroceSELECT customer_name FROM GRAPH_TABLE (myshop MATCH (c IS customers)-[IS customer_orders]->(o IS orders WHERE o.ordered_when = current_date) COLUMNS (c.name AS customer_name));Ça rappelle neo4j, mais je ne pense pas que ce soit quelque chose qu’un outil sérieux devrait copier tel quel en 2026
Au final, ce qui m’intéresse, c’est la vitesse. La sécurité au niveau des lignes est une fonctionnalité très utile, mais tenter de construire quelque chose de sérieux avec l’implémentation de Postgres est téméraire. Le planner part en vrille et fait du matching ligne par ligne, ce qui détruit les performances
C’est SQL/PGQ, dérivé du langage Cypher de Neo4J et désormais intégré au standard SQL
J’aimerais que PostgreSQL ajoute non seulement la compression de lignes, mais aussi la compression de blocs. La compression de lignes seule a un effet trop limité
On peut mettre les données dans un pool ZFS et activer la compression de blocs, mais une prise en charge native réduirait la charge de configuration et pourrait aussi offrir de meilleures performances
GROUP BY ALL est vraiment logique quand on y pense, et c’est amusant parce que je n’y avais jamais songé auparavant
D’un point de vue plutôt DevOps, j’aimerais vraiment que PostgreSQL prenne enfin en charge les mises à niveau sur place entre versions majeures consécutives
La plupart des distributions peuvent gérer la contrainte pénible qui consiste à faire tourner l’ancienne et la nouvelle version côte à côte pour
pg_upgrade, mais avec Docker, passer à une nouvelle version majeure est vraiment douloureuxJe suis content que GROUP BY ALL arrive. À ma connaissance, c’est un concept introduit par DuckDB
La documentation de DuckDB indique aussi que plusieurs fonctionnalités ont d’abord été introduites dans DuckDB, puis adoptées par d’autres systèmes, comme
GROUP BY ALLhttps://duckdb.org/docs/lts/sql/dialect/friendly_sql