1. Common Table
Expressions
Quand et comment les utiliser, quand les éviter
Meetup PostgreSQL Nantes #9
28 février 2018
Mickaël Le Baillif
Head of Core Engineering
@Lengow
demikl
2. De quoi va-t-on discuter ?
● Historique
● Exemples de CTE utiles
○ gain en lisibilité
○ factorisation
○ récursivité
○ les CTE qui modifient des données
● zones de danger
3. Historique
● Syntaxe WITH [RECURSIVE] ajoutée dans SQL:1999
● alternative aux subqueries
● implémentée à partir de PostgreSQL >= 8.3
● writable CTE depuis PostgreSQL >= 9.1
11. Les CTE qui altèrent le contenu d’une BDD
PostgreSQL >= 9.1 : “writable CTE”
● utilisé pour implémenter
l’UPSERT avant PG 9.5 et sa
syntaxe
“INSERT … ON CONFLICT
…”
● utile aussi pour la duplication
de données liées
duplication de données liées
12. Les CTE qui altèrent le contenu d’une BDD
district
city_id name lat long
100 Jeavons 10.1344 34.214
100 Sampalok 12.002 34.891
100 Lillylight 11.210 34.305
city
id name color
100 Makkathran orange
13. Les CTE qui altèrent le contenu d’une BDD
city
id name color
100 Makkathran orange
484 Makkathran_copy orange
district
city_id name lat long
100 Jeavons 10.1344 34.214
100 Sampalok 12.002 34.891
100 Lillylight 11.210 34.305
484 Jeavons 10.1344 34.214
15. Danger : multiplier inutilement les SEQSCAN
d’une CTERappel : CTE pour factoriser
16. Danger : multiplier inutilement les SEQSCAN
d’une CTEUtiliser les syntaxes privilégiant un seul SEQSCAN quand c’est possible
17. Danger : barrière à l’optimisation des plans
d’exécution● CTE ~= tables temporaires anonymes
● ⊕ :avec les writable CTE si utilisées plusieurs fois dans une requête :
○ les tables ne sont modifiées qu’une seule fois
○ le CTE renvoie le même dataset à chaque utilisation (ex: DELETE)
● ⊖: les CTE sont évaluées séquentiellement avant la requête principale
○ brassent potentiellement davantage de données que ce qui est utile
18. Danger : barrière à l’optimisation des plans
d’exécution
calcul pour toutes les couleurs calcul uniquement pour les 3 couleurs
sous-requete : on presente d’abord les données finales qu’on souhaite recuperer, puis les algos de recuperation
CTE : on decrit d’abord les algos, comment generer la donnee, puis on ecrit comment presenter cette donnee
delai entre achat d’une premiere voiture et achat des suivantes :
on commence par definir l’ordre d’achat des voitures, et on associe a chacune la date d’achat de la 1ere pour chaque personne
on finit par calculer le délai moyen pour chaque personne
2 calculs d’aggregation differents sur un meme jeu de donnees