Nouveautés de PostgreSQL 11

Workshop 11

Dalibo & Contributors

Nouveautés de PostgreSQL 11

PostgreSQL

Introduction

  • Développement depuis l’été 2017
  • Version bêta 1 sortie 24 mai 2018
  • Bêta 2 le 28 juin
  • Bêta 3 le 9 août
  • Bêta 4 le 17 septembre
  • Release Candidate 1 le 11 octobre
  • Version finale : 18 octobre 2018
  • 11.1 : le 8 novembre 2018
  • 11.2 : attendue pour le 14 février 2019
  • Plus de 1,5 millions de lignes de code C
  • Des centaines de contributeurs

Au menu

  • Partitionnement
  • Performances
  • Sécurité et intégrité
  • SQL & PL/pgSQL
  • Outils
  • Réplication
  • Compatibilité
  • Futur

Nouveautés sur le partitionnement

  • Partitionnement par hachage
  • Propagation des index
  • Support de clés primaires et clés étrangères
  • Mise à jour de la clé de partition
  • Partition par défaut
  • Amélioration des performances
  • Clause INSERT ON CONFLICT
  • Trigger FOR EACH ROW

Partitionnement par hachage

  • Répartition des données suivant le hachage de la clé de partition
  • Partitions destinées à grandir de manière uniforme

Exemple de partitionnement par hachage

  • Créer une table partitionnée :
    CREATE TABLE t1(c1 int) PARTITION BY HASH (c1)
  • Ajouter une partition :
    CREATE TABLE t1_a PARTITION OF t1
      FOR VALUES WITH (modulus 3,remainder 0)
  • Augmentation du nombre de partitions délicat

Propagation des index sur les partitions

  • Index sur une table partitionnée
  • Index créé sur chaque partition
    • Hors partitions distantes
  • Création automatique sur toute nouvelle partition

Support des clés primaires

  • Support des index UNIQUE
  • Permet la création de clés primaires
  • Uniquement si l’index comprend la clé de partition

Support des clés étrangères

  • Clé étrangère depuis une table partitionnée
  • Clé étrangère vers une table partitionnée toujours impossible
    • mais possible vers une partition spécifique

Mise à jour d’une valeur de la clé de partition

  • En version 10 : DELETE puis INSERT obligatoires si clé modifiée
  • En version 11 : UPDATE fonctionne
    • Ligne déplacée dans une nouvelle partition

Partition par défaut

  • Pour les données n’appartenant à aucune autre partition :
    CREATE TABLE livres_default PARTITION OF livres DEFAULT;

Performance & partitions

  • Amélioration de l’algorithme d’élagage
  • enable_partition_pruning 
  • Élagage dynamique des partitions, à l’exécution

Autres nouveautés du partitionnement

  • Clause INSERT ON CONFLICT
    • sauf mise à jour de clé
  • Partition-Wise Aggregate (par défaut : off)
  • Triggers AFTER ... FOR EACH ROW
  • Partitions distantes : routage pour les insertions
    • uniquement postgres_fdw
    • pas de propagation des index
    • sharding !

Performances

  • Compilation Just In Time (JIT)
  • Parallélisme étendu à plusieurs commandes
  • ALTER TABLE ADD COLUMN ... DEFAULT ... sans réécriture

JIT : la compilation à la volée

  • Compilation Just In Time des requêtes
  • Utilise le compilateur LLVM
  • Vérifier que l’installation est fonctionnelle
  • Désactivé par défaut

JIT : qu’est-ce qui compilé ?

  • Tuple deforming
  • Évaluation d’expressions :
    • WHERE
    • Agrégats, GROUP BY
  • Appels de fonctions (inlining)
  • Mais pas les jointures

JIT : algorithme « naïf »

  • jit (défaut : off)
  • jit_above_cost (défaut : 100 000)
  • jit_inline_above_cost (défaut : 500 000)
  • jit_optimize_above_cost (défaut : 500 000)
  • à comparer au coût de la requête… I/O comprises
  • Seuils arbitraires !

Exemple de plan d’exécution avec JIT

 Planning Time: 0.553 ms
 JIT:
   Functions: 27
   Generation Time: 7.058 ms
   Inlining: true
   Inlining Time: 16.028 ms
   Optimization: true
   Optimization Time: 617.294 ms
   Emission Time: 425.744 ms
 Execution Time: 29402.666 ms

Quand le JIT est-il utile ?

  • Pas de limitation par les I/O
  • Requêtes complexes (calculs, agrégats, appels de fonctions…)
  • Beaucoup de lignes, filtres
  • Assez longues pour « rentabiliser » le JIT
  • Analytiques, pas ERP

Parallélisme : nouvelles améliorations

  • NÅ“uds Append (UNION ALL)
  • Jointures type Hash
  • CREATE TABLE AS SELECT...
  • CREATE MATERIALIZED VIEW
  • SELECT INTO
  • CREATE INDEX (B-tree)
    • nouveau paramètre max_parallel_maintenance_workers

ALTER TABLE ADD COLUMN … DEFAULT … sans réécriture

  • ALTER TABLE ADD COLUMN ... DEFAULT ...
    • v10 : réécriture complète de la table !
    • v11 : valeur par défaut mémorisée, ajout instantané
    • … si le défaut n’est pas une fonction volatile

Sécurité et intégrité

  • Nouveaux rôles
  • Vérification d’intégrité

Nouveaux rôles

  • pg_read_server_files : permet la lecture de fichier sur le serveur
  • pg_write_server_files : permet la modification de fichier sur le serveur
  • pg_execute_server_program : permet l’exécution de fichier sur le serveur
  • Rappel : \COPY sans limitation depuis le client

Vérification d’intégrité

  • Nouvelle commande pg_verify_checksums (à froid)
  • Vérification des sommes de contrôles dans pg_basebackup
  • Amélioration d’amcheck
    • v10 : 2 fonctions de vérification de l’intégrité des index
    • v11 : vérification de la cohérence avec la table (probabiliste)

SQL et PL/pgSQL

  • Index couvrants
  • Objets PROCEDURE
  • Contrôle transactionnel en PL
  • JSON
  • PL/pgSQL
  • Fonctions de fenêtrage
  • Autres nouveautés

Index couvrants

  • Déclaration grâce au mot clé INCLUDE
  • Uniquement pour les index B-Tree
  • Permet des Index Only Scan en complétant des index uniques

Objet PROCEDURE

  • Conforme à la norme SQL
  • Création par CREATE PROCEDURE
  • Appel avec CALL
  • Ne retourne rien
  • Permet un contrôle transactionnel en PL

Contrôle transactionnel en PL

  • Disponible en PL/pgSQL, PL/Perl, PL/Python, PL/Tcl, SPI (C)
  • Utilisable :
    • dans des blocs DO / CALL
    • dans des objets de type PROCEDURE
  • Ne fonctionne pas à l’intérieur d’une transaction
  • Incompatible avec une clause EXCEPTION

PL/pgSQL

  • Ajout d’une clause CONSTANT à une variable
  • Contrainte NOT NULL à une variable

JSON

  • Conversion de et vers du type jsonb
    • en SQL : booléen et nombre
    • en PL/Perl : tableau et hash (extension jsonb_plperl)
    • en PL/Python : dict et list (extension jsonb_plpython)
  • Conversion JSON en tsvector pour la Full text Search

Fonctions de fenêtrage

  • Finalisation du support de la norme SQL:2011
    { RANGE | ROWS | GROUPS } frame_start [ frame_exclusion ]
    { RANGE | ROWS | GROUPS } BETWEEN frame_start AND frame_end [ frame_exclusion ]
  • avec exclusion :
    EXCLUDE {CURRENT ROW|GROUP|TIES|NO OTHERS}

Autres nouveautés

  • ANALYSE et VACUUM tables multiples
  • LOCK TABLE view
  • Définir le seuil de conversion en TOAST :
    CREATE TABLE ... WITH (toast_tuple_target = N)

Outils

  • psql
  • initdb
  • pg_dump et pg_dumpall
  • pg_basebackup
  • pg_rewind

psql

  • SELECT ... FROM ... \gdesc
    • ou \gdesc seul après exécution
    • retourne le type des colonnes sans exécution
  • Variables de suivi des erreurs de requêtes
    • ERROR, SQLSTATE et ROW_COUNT
  • exit et quit à la place de \q pour quitter psql
  • fonctionnalités psql, donc utilisables sur des instances < 11

initdb

  • option --wal-segsize :
    • spécifie la taille des fichier WAL à l’initialisation (1 Mo à 1 Go)
  • option --allow-group-access :
    • Droits de lecture et d’exécution au groupe auquel appartient l’utilisateur initialisant l’instance.
    • Droit sur les fichiers : drwxr-x---

Sauvegarde et restauration

  • pg_dumpall
    • option --encoding pour spécifier l’encodage de sortie
    • -g ne sort plus les permissions et les configurations de variables
    • Ajouter --create à pg_dump -Fp ou pg_restore pour cela !
    • Révisez vos scripts !
  • pg_dump --load-via-partition-root : partitions en bloc
  • pg_basebackup
    • option --create-slot pour créer un slot de réplication permanent

pg_rewind

  • pg_rewind : optimisations de fichiers inutiles
  • interdit en tant que root
  • possible avec un accès non-superuser sur le maître

pg_prewarm

  • pg_prewarm : chargement de données en cache (shared buffers ou OS)
  • En v11 :
    • mémorisation régulière des blocs dans les shared buffers
    • chargement automatique de ces blocs au démarrage

Réplication

  • Réplication logique
  • Taille des WALs et checkpoint

Réplication Logique

  • Réplication de l’ordre TRUNCATE
  • Réduction de l’empreinte mémoire
  • Migration majeure par réplication logique

WAL et Checkpoint

  • Suppression du second checkpoint

Les outils de la sphère Dalibo

Outil Compatibilité avec PostgreSQL 11
pitrery Oui
ldap2pg Oui
pgBadger Oui
pgCluu Oui
ora2Pg Oui
powa-archivist oui

Futur

  • Développement de la version 12 entamé durant l’été 2018
  • Déjà présent ou à venir, sans garantie :
    • Amélioration du partitionnement
    • Amélioration du parallélisme
    • Amélioration du JIT
    • Index couvrants sur GiST
    • Clause SQL MERGE
    • Filtrage des lignes pour la réplication logique
    • Support de GnuTLS
    • ANALYZE nom_index
    • Pluggable Storage API : alternatives à MVCC ?
    • …

Questions

SELECT * FROM questions;

Atelier

À présent, place à l’atelier…

  • Installation
  • Mise à jour d’une partition avec un UPDATE
  • Manipulation du partitionnement par hachage
  • TRUNCATE avec la réplication logique
  • Mise à jour PostgreSQL 10 vers 11 avec la réplication logique
  • Index couvrants
  • Parallélisation
  • Sauvegarde des droits avec pg_dump
  • l’extension pg_prewarm
  • Test du JIT

Installation

Mise à jour d’une clé de partition avec UPDATE

Partitionnement par hachage

Support du TRUNCATE dans la réplication logique

Mise à jour Majeure avec la réplication logique

Index couvrants

Parallélisation

Sauvegarde des droits avec pg_dump

pg_prewarm

JIT