Après seulement une release candidate (mais auparavant 4 version bêta), PostgreSQL 11 vient de sortir!!!! Et comme à chaque nouvelle version son lot de nouveautés que nous allons essayer de passer rapidement en revue.
# Amélioration de la parallélisation
Quoi de mieux que de commencer le tour des nouveautés par un sujet que l’on a abordé lors du PG Day France 2018
PostgreSQL 11 va encore plus loin dans la parallélisation avec :
-
- Création d’index B-tree en parallèle
- Parallélisation des UNION ALL
- Amélioration du Parallel hash join (paralléliser le remplissage d’une seule table de hachage, partagée) et parallelized sequential scans
- Parallélisation sur la création de vue matérialisée et table à partir des résultats d’une requête
1 |
CREATE TABLE .. AS, SELECT INTO et CREATE MATERIALIZED VIEW. |
- Ajout d’un paramètre de configuration du serveur « parallel_leader_participation » qui permet de contrôler si le processus leader participe à l’exécution des sous plans d’exécution
# Amélioration du partitionnement
-
- La possibilité de partitionner une table par hashage de clé (en plus des autres)
1 2 3 4 5 |
CREATE TABLE hash1 (col1 NUMERIC, col2 VARCHAR(10)) PARTITION BY HASH(col1); CREATE TABLE hash1a PARTITION OF hash1 FOR VALUES WITH (MODULUS 4, REMAINDER 0) ; CREATE TABLE hash1b PARTITION OF hash1 FOR VALUES WITH (MODULUS 4, REMAINDER 1) ; CREATE TABLE hash1c PARTITION OF hash1 FOR VALUES WITH (MODULUS 4, REMAINDER 2) ; CREATE TABLE hash1d PARTITION OF hash1 FOR VALUES WITH (MODULUS 4, REMAINDER 3) ; |
-
- Ajout possible d’une partition par défaut pour les données ne correspondant à aucune partition
1 |
CREATE TABLE table1d PARTITION OF table1 DEFAULT; |
-
- La possibilité de créer des clés primaires, clés étrangères, index et triggers qui seront automatiquement applicables sur l’ensemble des partitions
- Support du changement automatique de partition en cas de mise à jour de la clé de partitionnement
- Amélioration des performances lors des SELECT sur la lecture des partitions
- Support des upsert sur les tables partitionnées
1 2 3 4 |
INSERT INTO tablep1 (col1, col2) VALUES (100, 'update') ON CONFLICT ON CONSTRAINT tablep1_pkey DO UPDATE SET col2='update' ; |
# Gestion des transactions dans les procédures stockées
PostgreSQL 11 introduit la possibilité de créer des procédures (en PL/pgSQL, PL/Perl, PL/Python, et PL/Tcl). Depuis de nombreuses années, il est possible dans PostgreSQL de créer des fonctions et bien ici ça y ressemble fortement, sauf que l’on ne retourne pas de résultats et que l’on peut gérer les transactions !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
CREATE PROCEDURE transaction_test1() LANGUAGE plpgsql AS $$ BEGIN FOR i IN 0..9 LOOP INSERT INTO table1 (col1) VALUES (i) ; IF i % 2 = 0 THEN COMMIT; ELSE ROLLBACK; END IF; END LOOP; END; $$; |
L’exécution de ces procédures se fait en utilisant la commande CALL
1 |
CALL transaction_test1(); |
# Compilation JIT
PostgreSQL 11 introduit le support de la compilation Just-in-Time (JIT) pour optimiser l’exécution de code et d’autres opérations. Utilisant des composants du projet LLVM, l’introduction de JIT dans PostgreSQL accélère les requêtes utilisant des expressions, listes, agrégats, projections, ainsi que certaines opérations internes.
Pour pouvoir utiliser la compilation JIT, vous devrez installer la dépendance LLVM puis activer la compilation JIT soit dans le fichier de configuration (jit = on), soit durant votre session en exécutant SET jit = on.
La compilation JIT bénéficie surtout aux requêtes de longue durée et limitées par le processeur. Ce seront souvent des requêtes analytiques (OLAP). Pour les requêtes courtes, le surcoût apporté par la compilation JIT sera souvent supérieur au temps qu’elle permet de gagner.
# Améliorations générales SQL
-
- Support de toutes les clauses (SQL:2011) dans les fonctions de fenêtrage ce qui permet maintenant l’utilisation de RANGE dans des clauses PRECEDING/FOLLOWING, GROUPS ou d’exclusion
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
WINDOW window_name AS ( [ PARTITION BY expression [, ...] ] [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ] [ frame_clause ] ) frame_clause : { RANGE | ROWS | GROUPS } frame_start [ frame_exclusion ] { RANGE | ROWS | GROUPS } BETWEEN frame_start AND frame_end [ frame_exclusion ] frame_start / frame_end : UNBOUNDED PRECEDING offset PRECEDING CURRENT ROW offset FOLLOWING UNBOUNDED FOLLOWING frame_exclusion : EXCLUDE CURRENT ROW EXCLUDE GROUP EXCLUDE TIES EXCLUDE NO OTHERS |
-
- Ajout de fonctions de hash sha-2 : sha224(), sha256(), sha384() et sha512()
- Ajout de fonctions de recherche plein texte : json(b)_to_tsvector() et websearch_to_tsquery()
- Ajout de l’opérateur ^@ identique à LIKE ‘mot%’ mais plus efficace sur un index b-tree
1 |
text ^@ text |
-
- Amélioration des index avec l’ajout du mot clef INCLUDE, qui permet d’indiquer une liste de colonnes qui seront incluses dans l’index comme des colonnes non clés. L’ajout de colonnes dans la création d’index permet alors l’utilisation de parcours d’index couvrants.
1 2 3 4 5 6 |
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] nom ] ON [ ONLY ] nom_table [ USING méthode ] ( { nom_colonne | ( expression ) } [ COLLATE collation ] [ classeop ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] ) [ INCLUDE ( nom_colonne [, ...] ) ] [ WITH ( parametre_stockage = valeur [, ... ] ) ] [ TABLESPACE nom_espacelogique ] [ WHERE prédicat ] |
- Amélioration de l’ordre ALTER TABLE .. ADD COLUMN .. DEFAULT .. avec une valeur par défaut non NULL n’a plus besoin de réécrire entièrement la table lors de son exécution, ce qui entraîne une grosse amélioration des performances.
# Authentification
- Ajout de l’authentification LDAP, mais celle ci n’est utilisée que pour valider les paires nom d’utilisateur/mot de passe. De ce fait, pour pouvoir utiliser LDAP comme méthode d’authentification, l’utilisateur doit préalablement exister dans la base.
# psql
Le client psql évolue lui aussi :
-
- Ajout des commandes « quit » et « exit » dans le client psql… (fini les personnes prisent de panique pour sortir de leur terminal ??? )
-
- Ajout de la commande \gdesc pour afficher les noms et types de colonnes du résultat de la requête
- Ajout de variables pour les erreurs et activités des requêtes ERROR, SQLSTATE, ROW_COUNT, LAST_ERROR_MESSAGE, and LAST_ERROR_SQLSTATE.
- Ajout de la possibilité de tester l’existence d’une variable par exemple dans un if
1 |
\if :{?variable_name} |
- Amélioration de la complétion dans l’écriture de requêtes
En dehors de ces nouveautés en terme d’utilisation, cette nouvelle version apporte aussi des améliorations de performance et d’utilisation de mémoire.
Et voilà, nous avons fini notre petit tour rapide des nouveautés de postgreSQL 11, mais ne vous inquiétez pas une version 12 est déjà en préparation pour le troisième trimestre 2019.
2 Pingbacks