SQL
Internals
Configuration
PostgreSQL 9.5 : Nouveautés
Sébastien Lardière
mars 2016
S. Lardière PG95 – mars 2016 1 / 35
SQL
Internals
Configuration
PostgreSQL 9.5 : Nouveautés
1 SQL 2 Internals 3 Configuration
S. Lardière PG95 – mars 2016 2 / 35
SQL
Internals
Configuration
SQL
S. Lardière PG95 – mars 2016 3 / 35
SQL
Internals
Configuration
SQL
Langage SQL :
Sécurité
Performances
Transactions
S. Lardière PG95 – mars 2016 4 / 35
SQL
Internals
Configuration
UPSERT
UPSERT
INSERT or UPDATE
Faisable en plpgSQL
Transactions
S. Lardière PG95 – mars 2016 5 / 35
SQL
Internals
Configuration
UPSERT
L’exemple suivant montre l’insertion dans une table d’enregistrement de statistiques :
Exemple
INSERT INTO user_stats (id, connect)
VALUES (12345,1),(87654,1)
ON CONFLICT (id)
DO UPDATE SET connect = user_stats.connect + EXCLUDED.connect;
S. Lardière PG95 – mars 2016 6 / 35
SQL
Internals
Configuration
Row-Level Security Policies
Row-Level Security Policies
Contrôle d’accès aux données
Accès aux tuples
Utilisation de fonction utilisateur
S. Lardière PG95 – mars 2016 7 / 35
SQL
Internals
Configuration
Row-Level Security Policies
La fonction usertoid() traduit un nom d’utilisateur en id :
Exemple
ALTER TABLE user_stats ENABLE ROW LEVEL SECURITY;
CREATE POLICY policy_user ON user_stats
FOR ALL
TO PUBLIC
USING (id = usertoid(current_user));
S. Lardière PG95 – mars 2016 8 / 35
SQL
Internals
Configuration
GROUPING SETS, CUBE and ROLLUP
GROUPING SETS, CUBE and ROLLUP
Extension de GROUP BY
Permet plusieurs regroupements
Remplace UNION ALL
S. Lardière PG95 – mars 2016 9 / 35
SQL
Internals
Configuration
GROUPING SETS, CUBE and ROLLUP
Exemple :
Exemple
select gender, title, count(*)
from employees join titles using (emp_no)
group by
grouping sets ( ( gender, title ), (title), (gender), () ) ;
S. Lardière PG95 – mars 2016 10 / 35
SQL
Internals
Configuration
GROUPING SETS, CUBE and ROLLUP
Les trois fonctions ont chacune leur rôle :
GROUPING SETS ( (attr1, attr2), (attr2), (attr3, attr1) )
CUBE( attr1, attr2, attr3 )
ROLLUP( attr1, attr2, attr3 )
S. Lardière PG95 – mars 2016 11 / 35
SQL
Internals
Configuration
TABLESAMPLE
TABLESAMPLE
Utilisation d’un échantillon de données
Approximation du résultat
Différents algorythmes : SYSTEM, BERNOULLI
S. Lardière PG95 – mars 2016 12 / 35
SQL
Internals
Configuration
TABLESAMPLE
Exemple
employees=$
select avg(salary) from salaries ;
-[ RECORD 1 ]–––––-
avg | 63810.744836143706
Time: 318.682 ms
employees=$ select avg(salary) from salaries TABLESAMPLE system ( 0.1 );
-[ RECORD 1 ]–––––-
avg | 62681.119426751592
Time: 2.552 ms
employees=$ select avg(salary) from salaries TABLESAMPLE system ( 0.01 );
-[ RECORD 1 ]–––––-
avg | 62807.193205944798
Time: 0.584 ms
S. Lardière PG95 – mars 2016 13 / 35
SQL
Internals
Configuration
IMPORT FOREIGN SCHEMA
IMPORT FOREIGN SCHEMA
Import d’un schéma complet
Simplifie l’utilisation des FDWs
uniquement postgres_fdw pour le moment
S. Lardière PG95 – mars 2016 14 / 35
SQL
Internals
Configuration
Fonctions JSONB
L’opérateur || permet de concaténer des données jsonb
L’opérateur - permet de supprimer une clé d’une donnée jsonb
La fonction jsonb_set permet de mettre à jour la valeur d’une clé d’une donnée jsonb
La fonction jsonb_pretty permet de créer un rendu texte lisible depuis une donnée
jsonb
S. Lardière PG95 – mars 2016 15 / 35
SQL
Internals
Configuration
ALTER TABLE ... SET LOGGED / UNLOGGED
ALTER TABLE ... SET LOGGED / UNLOGGED
Possibilité de modifier le mode UNLOGGED :
Exemple
ALTER TABLE user_stats SET LOGGED ;
S. Lardière PG95 – mars 2016 16 / 35
SQL
Internals
Configuration
SKIP LOCKED
SKIP LOCKED
Modifie le comportement de SELECT ... FOR UPDATE
Ignore les verrous déjà posé
Obtiens les verrous libres
S. Lardière PG95 – mars 2016 17 / 35
SQL
Internals
Configuration
CREATE INDEX IF NOT EXISTS
CREATE INDEX IF NOT EXISTS
Pas d’erreur si l’index existe déjà :
Exemple
employees=# create unique index departments_dept_name_idx ON departments (dept_name) ;
ERROR: relation "departments_dept_name_idx" already exists
employees=# create unique index IF NOT EXISTS departments_dept_name_idx ON departments (dept_nam
NOTICE: relation "departments_dept_name_idx" already exists, skipping
CREATE INDEX
employees=# create unique index IF NOT EXISTS departments_dept_name_idx_fake ON departments (dep
CREATE INDEX
employees=# drop index departments_dept_name_idx_fake;
DROP INDEX
S. Lardière PG95 – mars 2016 18 / 35
SQL
Internals
Configuration
INTERNALS
S. Lardière PG95 – mars 2016 19 / 35
SQL
Internals
Configuration
Index BRIN
Index BRIN
Nouveau type d’index :Block Range INdex
Très gros volume de données (log)
Valeurs limites des blocs
Accès rapide aux pages de la table
S. Lardière PG95 – mars 2016 20 / 35
SQL
Internals
Configuration
Foreign Table Inheritance
Foreign Table Inheritance
Héritage de table étrangère
Utile pour le Sharding
S. Lardière PG95 – mars 2016 21 / 35
SQL
Internals
Configuration
Abbreviated Keys
Optimisation de tris (Abbreviated Keys)
Méthode alterative pour un tri
Version abrégée de la donnée
8 premiers octets
Divise par 3 le temps de tri
Types text et numeric
S. Lardière PG95 – mars 2016 22 / 35
SQL
Internals
Configuration
Améliorations du verrouillage
Améliorations du verrouillage
Lors des lectures
Diminuer l’impact de l’acquisition d’un verrou
Plus de “spinlock” exclusif
Améliore la concurrence en lecture
S. Lardière PG95 – mars 2016 23 / 35
SQL
Internals
Configuration
Réduction de la mémoire
Réduction de l’utilisation de la mémoire par backend
Référence à la mémoire partagée
Dans la mémoire des “backends”
Intérressant quand la mémoire partagée est importante
S. Lardière PG95 – mars 2016 24 / 35
SQL
Internals
Configuration
pg_rewind
pg_rewind
Commande système
Utile dans un contexte HA “service”
Remet un ancien “primary” au niveau de l’actuel “primary”
S. Lardière PG95 – mars 2016 25 / 35
SQL
Internals
Configuration
VACUUM en parallèle
VACUUM en parallèle
Commande système
Switch -j
Tables volumineuses en premier
S. Lardière PG95 – mars 2016 26 / 35
SQL
Internals
Configuration
CONFIGURATION
S. Lardière PG95 – mars 2016 27 / 35
SQL
Internals
Configuration
Suivi de l’horodatage des COMMIT
Suivi de l’horodatage des COMMIT
paramètre track_commit_timestamp
dans les WALs
pour chacune des transactions
utile pour BDR
S. Lardière PG95 – mars 2016 28 / 35
SQL
Internals
Configuration
Nom de l’instance
Nom de l’instance
paramètre cluster_name
complète l’utilisation du port TCP
utile lors de multiples instances
S. Lardière PG95 – mars 2016 29 / 35
SQL
Internals
Configuration
Gestion du recyclage des WAL et des CHECKPOINTs
Gestion du recyclage des WAL et des CHECKPOINTs
paramètres min_wal_size et max_wal_size
remplace checkpoint_segment
Donne une plage de déclenchement de CHECKPOINT
S. Lardière PG95 – mars 2016 30 / 35
SQL
Internals
Configuration
Contrôle de restauration
Contrôle de restauration
paramètre recovery_target_action dans recovery.conf
remplace pause_at_recovery_target
Donne une plage de déclenchement de CHECKPOINT
S. Lardière PG95 – mars 2016 31 / 35
SQL
Internals
Configuration
Mise à jour des index GIN
Mise à jour des index GIN
paramètre gin_pending_list_limit
Liste d’attente des index GIN (fastupdate)
Modifie les performances
S. Lardière PG95 – mars 2016 32 / 35
SQL
Internals
Configuration
RESET SYSTEM
RESET SYSTEM
SQL :
Exemple
ALTER SYSTEM RESET wal_level;
S. Lardière PG95 – mars 2016 33 / 35
SQL
Internals
Configuration
9.6
Parallélisme, Partitionnement, Planner
Feature Freeze le 8 avril
Beta en Mai
S. Lardière PG95 – mars 2016 34 / 35
SQL
Internals
Configuration
Merci!
Des Questions?
S. Lardière PG95 – mars 2016 35 / 35

Nouveautés de PostgreSQL 9.5