SlideShare une entreprise Scribd logo
1  sur  19
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
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
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
Cas utiles
Gain en lisibilité
Exposer dans l’ordre “humain” les étapes de récupération des jeux de données utilisés
sous-requête CTE
Gain en lisibilité
Filtrage après application d’une WINDOW FUNCTION
Factorisation
Réutiliser un même jeu de données pour plusieurs usages
Factorisation
Cas concret : utilisation d’un échantillonnage pour estimer un taux de couverture
Récursivité
“itératif convergeant”
1. Requête d’initialisation du jeu de donnée
2. Requête d’accumulation, rejouée tant
qu’elle génère de nouvelles données
Récursivité
données d’entrée
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
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
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
Zones de danger
Danger : multiplier inutilement les SEQSCAN
d’une CTERappel : CTE pour factoriser
Danger : multiplier inutilement les SEQSCAN
d’une CTEUtiliser les syntaxes privilégiant un seul SEQSCAN quand c’est possible
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
Danger : barrière à l’optimisation des plans
d’exécution
calcul pour toutes les couleurs calcul uniquement pour les 3 couleurs
Questions ?

Contenu connexe

Similaire à Common Table Expressions

Se noyer dans les yeux de Cassandre
Se noyer dans les yeux de CassandreSe noyer dans les yeux de Cassandre
Se noyer dans les yeux de CassandreMathieu Goeminne
 
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines Databricks
 
#OSSPARIS19 - Stream processing : de la base de données classique au streamin...
#OSSPARIS19 - Stream processing : de la base de données classique au streamin...#OSSPARIS19 - Stream processing : de la base de données classique au streamin...
#OSSPARIS19 - Stream processing : de la base de données classique au streamin...Paris Open Source Summit
 
pmsipilotMCOCriteria
pmsipilotMCOCriteriapmsipilotMCOCriteria
pmsipilotMCOCriteriaPMSIpilot
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Jean-Michel Doudoux
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introOlivier Mallassi
 
Le futur d'apache cassandra
Le futur d'apache cassandraLe futur d'apache cassandra
Le futur d'apache cassandraDuyhai Doan
 
Modern DevOps - kill the bottleneck (part 2/2)
Modern DevOps - kill the bottleneck (part 2/2)Modern DevOps - kill the bottleneck (part 2/2)
Modern DevOps - kill the bottleneck (part 2/2)Loic Ortola
 
Manipulation des Données , cours sql oracle
Manipulation des Données , cours sql oracleManipulation des Données , cours sql oracle
Manipulation des Données , cours sql oraclewebreaker
 
Algorithme distribués pour big data saison 2 @DevoxxFR 2016
Algorithme distribués pour big data saison 2 @DevoxxFR 2016Algorithme distribués pour big data saison 2 @DevoxxFR 2016
Algorithme distribués pour big data saison 2 @DevoxxFR 2016Duyhai Doan
 
Examne sybase corrige
Examne sybase corrigeExamne sybase corrige
Examne sybase corrigewebreaker
 
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02Jérôme Mainaud
 
Les secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceLes secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceOCTO Technology
 
Chap XIV : Calcul parallèle (Fondements & Principe d'utilisation)
Chap XIV : Calcul parallèle (Fondements & Principe d'utilisation)Chap XIV : Calcul parallèle (Fondements & Principe d'utilisation)
Chap XIV : Calcul parallèle (Fondements & Principe d'utilisation)Mohammed TAMALI
 
Digital_Signal_Processors_TG_FULL.pdf
Digital_Signal_Processors_TG_FULL.pdfDigital_Signal_Processors_TG_FULL.pdf
Digital_Signal_Processors_TG_FULL.pdfHouBou3
 

Similaire à Common Table Expressions (20)

Mongo DB
Mongo DBMongo DB
Mongo DB
 
Se noyer dans les yeux de Cassandre
Se noyer dans les yeux de CassandreSe noyer dans les yeux de Cassandre
Se noyer dans les yeux de Cassandre
 
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
 
#OSSPARIS19 - Stream processing : de la base de données classique au streamin...
#OSSPARIS19 - Stream processing : de la base de données classique au streamin...#OSSPARIS19 - Stream processing : de la base de données classique au streamin...
#OSSPARIS19 - Stream processing : de la base de données classique au streamin...
 
Cari2020 dembele
Cari2020 dembeleCari2020 dembele
Cari2020 dembele
 
pmsipilotMCOCriteria
pmsipilotMCOCriteriapmsipilotMCOCriteria
pmsipilotMCOCriteria
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
 
Oracle : Foctionnement
Oracle : FoctionnementOracle : Foctionnement
Oracle : Foctionnement
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
 
Le futur d'apache cassandra
Le futur d'apache cassandraLe futur d'apache cassandra
Le futur d'apache cassandra
 
Modern DevOps - kill the bottleneck (part 2/2)
Modern DevOps - kill the bottleneck (part 2/2)Modern DevOps - kill the bottleneck (part 2/2)
Modern DevOps - kill the bottleneck (part 2/2)
 
Manipulation des Données , cours sql oracle
Manipulation des Données , cours sql oracleManipulation des Données , cours sql oracle
Manipulation des Données , cours sql oracle
 
Algorithme distribués pour big data saison 2 @DevoxxFR 2016
Algorithme distribués pour big data saison 2 @DevoxxFR 2016Algorithme distribués pour big data saison 2 @DevoxxFR 2016
Algorithme distribués pour big data saison 2 @DevoxxFR 2016
 
Examne sybase corrige
Examne sybase corrigeExamne sybase corrige
Examne sybase corrige
 
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
 
Les secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceLes secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquence
 
Design patterns
Design patternsDesign patterns
Design patterns
 
algo-imsi-2.pdf
algo-imsi-2.pdfalgo-imsi-2.pdf
algo-imsi-2.pdf
 
Chap XIV : Calcul parallèle (Fondements & Principe d'utilisation)
Chap XIV : Calcul parallèle (Fondements & Principe d'utilisation)Chap XIV : Calcul parallèle (Fondements & Principe d'utilisation)
Chap XIV : Calcul parallèle (Fondements & Principe d'utilisation)
 
Digital_Signal_Processors_TG_FULL.pdf
Digital_Signal_Processors_TG_FULL.pdfDigital_Signal_Processors_TG_FULL.pdf
Digital_Signal_Processors_TG_FULL.pdf
 

Common Table Expressions

  • 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
  • 5. Gain en lisibilité Exposer dans l’ordre “humain” les étapes de récupération des jeux de données utilisés sous-requête CTE
  • 6. Gain en lisibilité Filtrage après application d’une WINDOW FUNCTION
  • 7. Factorisation Réutiliser un même jeu de données pour plusieurs usages
  • 8. Factorisation Cas concret : utilisation d’un échantillonnage pour estimer un taux de couverture
  • 9. Récursivité “itératif convergeant” 1. Requête d’initialisation du jeu de donnée 2. Requête d’accumulation, rejouée tant qu’elle génère de nouvelles données
  • 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

Notes de l'éditeur

  1. 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
  2. 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
  3. 2 calculs d’aggregation differents sur un meme jeu de donnees
  4. DEMO !