Aujourd’hui, c’est la sortie de PostgreSQL 10!!!! Première révolution, la numérotation des versions : on passe de 9.4…9.6 pour les versions majeures à 10, 11, 12… Ce point est important car un changement de version majeure implique une migration des données. Une opération beaucoup plus lourde que la seule mise à jour des exécutables !

Voici quelques détails sur cette nouvelle version 10 et ce qu’elle apporte :

Performance et partitionnement

  • Le partitionnement de table est maintenant un attribut de la table :
CREATE TABLE TABLE_NAME ( ... )
[ PARTITION BY { RANGE | LIST } ( { column_name | ( expression ) }
 
CREATE TABLE TABLE_NAME
PARTITION OF parent_table [ (
) ] FOR VALUES partition_bound_spec
  • PostgreSQL 10 va plus loin dans la parallélisation avec le parallélisme des Index-Only Scan, Index Scan, Bitmap Heap Scan, Merge Join / Gather Merge, Subplan-Related Improvements
  • Amélioration des performances pour les agrégats et jointures avec postgres_fdw
  • Amélioration des performances de l’analyseur de requête
  • Apparition des statistiques multi-colonnes
  • Amélioration du plan d’exécution des requêtes

Réplication et scalabilité

  • Réplication logique : légère et basée sur les WAL, répliquant les objets individuellement via les commandes PUBLICATION (primaire) et SUBSCRIPTION (secondaire)
  • CREATE PUBLICATION financials FOR TABLE ONLY loans, ONLY fines;
    CREATE SUBSCRIPTION financials
    CONNECTION 'dbname=libdata user=postgres host=172.17.0.2'
    PUBLICATION financials;
  • QUORUM replication : avec ANY et FIRST pour synchronous_standby_names;
  • synchronous_standby_names = ANY 2(node1,node2,node3);
    synchronous_standby_names = FIRST 2(node1,node2);
  • Suppression automatique à la fin de la session des slots de réplication temporaires
  • Amélioration de libpq permettant des connexions a de multiples systèmes
  • Amélioration des performances de la réplication physique

Administration

    • Support de la compression pour pg_receivewal
    • Ajout d’informations sur les Background processes et Wait Events dans pg_stat_activity
    • Ajout de fonctions qui remontent à l’utilisateur des informations sur le status de transaction. L’usage principal de ces fonctions est de déterminer les transactions commitées entre deux snapshots.
txid_status(BIGINT)

Fonctionnalités SQL et développeurs

    • Gestion de colonne Identity qui vise à remplacer l’utilisation du type serial et qui est conforme au standard SQL
CREATE TABLE test_new (
    id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    payload text
);

plus d’informations sur ce sujet ici par exemple

    • Possibilité de renommer la valeur d’une énumération
CREATE TYPE langage AS ENUM ('SQL', 'JAVA', 'HTML') ;
ALTER TYPE langage RENAME VALUE 'HTML' TO 'HTML5' ;
    • Ajout des triggers AFTER STATEMENT qui peuvent avoir accès à l’ensemble des lignes modifiées, avant et après changement, à travers une pseudo-variable de type table
CREATE TRIGGER nom_trigger AFTER DELETE ON nom_table
REFERENCING OLD TABLE AS OLD
FOR EACH STATEMENT
EXECUTE PROCEDURE nom_procedure();
    • Ajout de la fonction xmltable qui produit une table basée sur la valeur XML donnée.
    • Supprimer des éléments d’un JSONB
SELECT '{"a":1 , "b":2, "c":3}'::jsonb - '{a,c}'::text[] ;
    • Il est possible de créer des indexes full text sur une colonne JSON ou JSONB
CREATE INDEX bookdata_fts ON bookdata
USING gin (( to_tsvector('english',bookdata) ));
 
SELECT bookdata -> 'title'
FROM bookdata
WHERE to_tsvector('english',bookdata) @@ to_tsquery('duke');

Sécurité

    • Authentification SCRAM plus sécurisée que md5
    • Création de nouveau rôle pour le monitoring évitant ainsi d’être super utilisateur
pg_read_all_settings : Lit toutes les variables de configuration, y compris celles normalement visibles des seuls super-utilisateurs.
pg_read_all_stats : Lit toutes les vues pg_stat_* et utilise plusieurs extensions relatives aux statistiques, y compris celles normalement visibles des seuls super-utilisateurs.
pg_stat_scan_tables : Exécute des fonctions de monitoring pouvant prendre des verrous verrous ACCESS SHARE sur les tables, potentiellement pour une longue durée.
pg_monitor : Lit et exécute plusieurs vues et fonctions de monitoring. Ce rôle est membre de pg_read_all_settings, pg_read_all_stats et pg_stat_scan_tables. 
    • Ajout de politiques restrictive dans les politiques de sécurité pour l’accès aux lignes et plus seulement de politiques permissives
CREATE POLICY admin_local_only ON passwd AS RESTRICTIVE TO admin
    USING (pg_catalog.inet_client_addr() IS NULL);

Autres fonctionnalités

  • file_fdw peut maintenant utiliser les programmes
  •    CREATE FOREIGN TABLE
       test(a INT, b text)
       SERVER csv
       OPTIONS (program 'gunzip -c /tmp/data.czv.gz');
  • support des collations ICU
  • Ajout d’un module amcheck permettant de vérifier cohérence / corruption d’un index B-Tree
  • CREATE EXTENSION amcheck ;
       SELECT bt_index_check('idx1_check1') ;

Modifications entrainant une incompatibilité ascendante

  • “xlog” et “clog” qui deviennent respectivement “wal” et “xact”.
  • fin du support du protocole client/serveur 1.0 (clients datant d’avant la version 6.3)
  • changement de valeurs par défaut pour pg_basebackup
  • fin du support des TIMESTAMP avec floating point.
  • Le module contrib/tsearch2 a été supprimé qui permettait une comptabilité avec les fonction de recherche full text avant la version 8.3
  • fin du support de la commande pg_dump pour les bases de données plus anciennes que la version 8.0

 

Et voilà, nous avons fini notre petit tour rapide des nouveautés de postgreSQL 10 mais une version 11 est déjà prévue pour dans 12 mois !