SlideShare a Scribd company logo
1 of 36
Download to read offline
DBA au service du développeur
Rodolphe Quiédeville
Meetup PostgreSQL Nantes
26 avril 2016
#mylife
Découvert Internet à 28.kbits avec Netscape Navigator
Utilise et produit du logiciel libre exclusivement
PostgreSQL depuis ... la 6.X ?
Consultant en performance des SI(G)
Senior Performance Engineer @PeopleDoc
Formateur Upstream University
SQL
ORM
Cas concret
Une observation du nombre d’oiseaux dans un espace fini
toutes les 5 minutes
Table ‘‘public.observation’’
Column | Type | Modifiers
----------+-----------------------------+---------------
obs_date | timestamp without time zone | default now()
duration | integer |
birds | integer |
Cas concret
Table des observations
pocpipe# select * from obs2 limit 5 ;
obs_date | duration | birds
---------------------+----------+-------
2000-01-01 00:00:00 | 4 | 67
2000-01-01 00:05:00 | 6 | 194
2000-01-01 00:10:00 | 17 | 273
2000-01-01 00:15:00 | 10 | 149
2000-01-01 00:20:00 | 4 | 77
Exploitation des données
Exploitation des données
SELECT
date_part ( ’ year ’ , obs_date ) ,
sum( birds ) : : f l o a t / sum( duration ) : : f l o a t
FROM observation
GROUP BY 1
ORDER BY 1 ASC ;
Non scalabilité
Le temps de réponse dépend du volume de données
Non scalabilité
Le temps de réponse dépend du volume de données
1 an de données 91 msec
Non scalabilité
Le temps de réponse dépend du volume de données
1 an de données 91 msec
4 ans de données 523 msec
Non scalabilité
Le temps de réponse dépend du volume de données
1 an de données 91 msec
4 ans de données 523 msec
12 ans de données 1495 msec
Mélange de données
Pour un graphique temps réel avec un historique conséquent
Mélange de données
Pour un graphique temps réel avec un historique conséquent
donnée froide (1,7M de tuples)
Mélange de données
Pour un graphique temps réel avec un historique conséquent
donnée froide (1,7M de tuples)
donnée chaude (toutes les 5 min)
Exploitation des données
SELECT
date_part ( ’ year ’ , obs_date ) ,
sum( birds ) : : f l o a t / sum( duration ) : : f l o a t
FROM observation
GROUP BY 1
ORDER BY 1 ASC ;
Exploitation des données
Gérer les données froides
CREATE MATERIALIZED VIEW observation_past AS
SELECT
date_part ( ’ year ’ , obs_date ) AS obs_year ,
SUM( birds ) : : f l o a t / SUM( duration ) : : f l o a t AS
birds_per_hour
FROM
observation
WHERE
date_part ( ’ year ’ , obs_date ) : : i n t < 2016
GROUP BY 1;
Time : 1275.701 ms
Exploitation des données froides
pocpipe#
SELECT * FROM observation_past
WHERE obs_year > 2010 ORDER BY obs_year;
obs_year | birds_per_hour
----------+------------------
2011 | 16.6410914009205
2012 | 16.6371300227029
2013 | 16.6985043384672
2014 | 16.6309208305199
2015 | 16.6618262419789
(5 rows)
Time: 0.609 ms
Exploitation des données chaudes
un peu plus complexe
appel à une solution extérieure
PipelineDB
www.pipelinedb.com
PostgreSQL Compatible
Continuous Aggregations
Sliding Window Queries
...
Le stream
Créer un stream pour alimenter la base
CREATE STREAM observations (
obs_date timestamp ,
duration int ,
birds i n t ) ;
La vue
Créer une vue pour consulter les données
CREATE CONTINUOUS VIEW observation_now AS
SELECT date_part ( ’ year ’ , obs_date ) AS obs_year ,
SUM( duration ) : : f l o a t AS sum_duration ,
SUM( birds ) : : f l o a t AS sum_birds
FROM
observations
WHERE
date_part ( ’ year ’ , obs_date ) >= 2016
GROUP BY
date_part ( ’ year ’ , obs_date ) ;
Le DBA au service du développeur
On va jouer à domicile :
CREATE EXTENSION postgres_fdw ;
CREATE SERVER foreign_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS ( host ’ 127.0.0.1 ’ , port ’ 9203 ’ ,
dbname ’ p ip el ine ’ ) ;
CREATE USER MAPPING FOR rodo
SERVER foreign_server
OPTIONS ( user ’ p ip eli ne ’ ,
password ’ pi pel in e ’ ) ;
Le DBA au service du développeur
La table locale pour alimenter le stream
CREATE FOREIGN TABLE observation_stream (
obs_date timestamp ,
duration int ,
birds i n t )
SERVER foreign_server
OPTIONS (
schema_name ’ public ’
, table_name ’ observations ’
, updatable ’ true ’ ) ;
Le DBA au service du développeur
La table locale pour récupérer les données
CREATE FOREIGN TABLE observation_now (
obs_year int ,
sum_duration int ,
sum_birds i n t )
SERVER foreign_server
OPTIONS (
schema_name ’ public ’
, table_name ’ observation_now ’
, updatable ’ false ’ ) ;
Toujours vide
pocpipe# select * from observation_now ;
obs_year | sum_duration | sum_birds
----------+--------------+-----------
(0 rows)
Alimentons pipelinedb
On va automatiser l’alimentation
CREATE OR REPLACE FUNCTION observation_feed_stream ( )
RETURNS TRIGGER AS $BODY$
BEGIN
INSERT INTO observation_stream
VALUES (NEW. obs_date ,
NEW. duration ,
NEW. birds ) ;
RETURN NEW;
END;
$BODY$ LANGUAGE plpgsql ;
CREATE TRIGGER observation_trigger
AFTER INSERT ON observation FOR EACH ROW
EXECUTE PROCEDURE observation_feed_stream ( ) ;
Alimentons pipelinedb
Reprise d’historique
INSERT INTO observation_stream
(SELECT ∗ FROM observation where
date_part ( ’ year ’ , obs_date ) = 2016 ) ;
INSERT 0 33409
Toujours vide ?
pocpipe# select * from observation_now ;
obs_year | sum_duration | sum_birds
----------+--------------+-----------
2016 | 299864 | 5010160
(1 row)
Time: 4.179 ms
Toujours vide ?
pocpipe# select * from observation_now ;
obs_year | sum_duration | sum_birds
----------+--------------+-----------
2016 | 299864 | 5010160
(1 row)
Time: 4.179 ms
pocpipe# INSERT INTO observation VALUES (now(), 30, 200);
INSERT 0 1
Time: 9.904 ms
Toujours vide ?
pocpipe# select * from observation_now ;
obs_year | sum_duration | sum_birds
----------+--------------+-----------
2016 | 299864 | 5010160
(1 row)
Time: 4.179 ms
pocpipe# INSERT INTO observation VALUES (now(), 30, 200);
INSERT 0 1
Time: 9.904 ms
pocpipe# select * from observation_now ;
obs_year | sum_duration | sum_birds
----------+--------------+-----------
2016 | 299894 | 5010360
(1 row)
Time: 1.194 ms
One Shot
Dernière vue
CREATE OR REPLACE VIEW observation_all AS
WITH cte AS (
SELECT obs_year , birds_per_hour FROM observation_past
UNION ALL
SELECT
obs_year , sum_birds : : f l o a t / sum_duration : : f l o a t AS
birds_per_hour
FROM observation_now )
SELECT obs_year , birds_per_hour FROM cte ;
Badoum Ba !
pocpipe# select * from observation_all order by 1;
obs_year | birds_per_hour
----------+------------------
2000 | 16.6203813775456
2001 | 16.6695899394653
2002 | 16.6471423597847
2003 | 16.5756814747212
2004 | 16.6575399685407
2005 | 16.6397299509002
2006 | 16.6371339270242
2007 | 16.6560480162363
2008 | 16.6965677534587
2009 | 16.6812852231278
2010 | 16.6404274047321
2011 | 16.6410914009205
2012 | 16.6371300227029
2013 | 16.6985043384672
2014 | 16.6309208305199
2015 | 16.6618262419789
2016 | 16.7081076754795
(17 rows)
Time: 4.211 ms
En résumé
On remplace une table par une vue
et
SELECT
date_part ( ’ year ’ , obs_date ) AS obs_year ,
SUM( birds ) : : f l o a t / SUM( duration ) : : f l o a t AS
birds_per_hour
FROM
observation
GROUP BY 1;
par
SELECT obs_year , birds_per_hour FROM observation_all ;
En résumé
Temps de requête passe de 2723 ms à 1.962 ms
Questions ?
Rodolphe Quiédeville
rodolphe.quiedeville@people-doc.com
Document publié sous Licence Creative Commons BY-SA 2.0

More Related Content

What's hot

pgBackRest - pgday.fr
pgBackRest - pgday.frpgBackRest - pgday.fr
pgBackRest - pgday.frslardiere
 
TP Git avancé DevoxxFR 2018 (exercices)
TP Git avancé DevoxxFR 2018 (exercices)TP Git avancé DevoxxFR 2018 (exercices)
TP Git avancé DevoxxFR 2018 (exercices)Jérôme Tamborini
 
Ingénierie de la performance au sein des mégadonnées
Ingénierie de la performance au sein des mégadonnéesIngénierie de la performance au sein des mégadonnées
Ingénierie de la performance au sein des mégadonnéesDaniel Lemire
 
Good or Evil: les fonctions anonymes en Javascript
Good or Evil: les fonctions anonymes en JavascriptGood or Evil: les fonctions anonymes en Javascript
Good or Evil: les fonctions anonymes en JavascriptNoirdes
 
SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015Rodolphe Quiédeville
 
Nouveautés PostgreSQL 12
Nouveautés PostgreSQL 12Nouveautés PostgreSQL 12
Nouveautés PostgreSQL 12slardiere
 
20170706 Terraform, Rancher et AWS EFS
20170706 Terraform, Rancher et AWS EFS20170706 Terraform, Rancher et AWS EFS
20170706 Terraform, Rancher et AWS EFSAlexis Ducastel
 
Introduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec RIntroduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec RLaurent Beauguitte
 
Comprendre les scripts shell auto-extractible
Comprendre les scripts shell auto-extractibleComprendre les scripts shell auto-extractible
Comprendre les scripts shell auto-extractibleThierry Gayet
 
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Bruno Bonnin
 

What's hot (14)

pgBackRest - pgday.fr
pgBackRest - pgday.frpgBackRest - pgday.fr
pgBackRest - pgday.fr
 
TP Git avancé DevoxxFR 2018 (exercices)
TP Git avancé DevoxxFR 2018 (exercices)TP Git avancé DevoxxFR 2018 (exercices)
TP Git avancé DevoxxFR 2018 (exercices)
 
Spark dataframe
Spark dataframeSpark dataframe
Spark dataframe
 
Ingénierie de la performance au sein des mégadonnées
Ingénierie de la performance au sein des mégadonnéesIngénierie de la performance au sein des mégadonnées
Ingénierie de la performance au sein des mégadonnées
 
Good or Evil: les fonctions anonymes en Javascript
Good or Evil: les fonctions anonymes en JavascriptGood or Evil: les fonctions anonymes en Javascript
Good or Evil: les fonctions anonymes en Javascript
 
SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015
 
Nouveautés PostgreSQL 12
Nouveautés PostgreSQL 12Nouveautés PostgreSQL 12
Nouveautés PostgreSQL 12
 
20170706 Terraform, Rancher et AWS EFS
20170706 Terraform, Rancher et AWS EFS20170706 Terraform, Rancher et AWS EFS
20170706 Terraform, Rancher et AWS EFS
 
Pytong2015
Pytong2015Pytong2015
Pytong2015
 
Bash bonnes pratiques
Bash bonnes pratiquesBash bonnes pratiques
Bash bonnes pratiques
 
Introduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec RIntroduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec R
 
Comprendre les scripts shell auto-extractible
Comprendre les scripts shell auto-extractibleComprendre les scripts shell auto-extractible
Comprendre les scripts shell auto-extractible
 
Ruby STAR
Ruby STARRuby STAR
Ruby STAR
 
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
 

Viewers also liked

A3 distrib fetes de fin d'annee 2013
A3 distrib   fetes de fin d'annee 2013A3 distrib   fetes de fin d'annee 2013
A3 distrib fetes de fin d'annee 2013Virginie Brunet
 
Formation en ligne, nouvelles pratiques pédagogiques &Moocs
Formation en ligne, nouvelles pratiques pédagogiques &MoocsFormation en ligne, nouvelles pratiques pédagogiques &Moocs
Formation en ligne, nouvelles pratiques pédagogiques &MoocsEsteban Giner
 
Power point (carrière informatique) a rendre
 Power point (carrière informatique) a rendre  Power point (carrière informatique) a rendre
Power point (carrière informatique) a rendre yamakuzayan1
 
Le pavillon Paul livret accueil
Le pavillon Paul livret accueilLe pavillon Paul livret accueil
Le pavillon Paul livret accueiltipsmarketing
 
Vivre en Martinique - L'attractivité de la Martinique
Vivre en Martinique - L'attractivité de la MartiniqueVivre en Martinique - L'attractivité de la Martinique
Vivre en Martinique - L'attractivité de la MartiniqueJulie Province
 
Marketing multicanal cmd
Marketing multicanal cmdMarketing multicanal cmd
Marketing multicanal cmdMagaliRebeyrat
 
Emailing - Connaître vos clients pour mieux communiquer : exemple avec Mr.Bri...
Emailing - Connaître vos clients pour mieux communiquer : exemple avec Mr.Bri...Emailing - Connaître vos clients pour mieux communiquer : exemple avec Mr.Bri...
Emailing - Connaître vos clients pour mieux communiquer : exemple avec Mr.Bri...Jonathan Loriaux
 
WeKeyPedia pitch @ SoData
WeKeyPedia pitch @ SoDataWeKeyPedia pitch @ SoData
WeKeyPedia pitch @ SoDataCRI Paris
 
Chloe charce etc96
Chloe charce etc96Chloe charce etc96
Chloe charce etc96spacebase
 
Bière sante et astuces
Bière sante et astucesBière sante et astuces
Bière sante et astucesPintCloner
 
Catalogue original 1963
 Catalogue original 1963 Catalogue original 1963
Catalogue original 1963grosseconne1
 
Carrière informatique sam savoie
Carrière informatique  sam savoieCarrière informatique  sam savoie
Carrière informatique sam savoiesamsavoie13
 
SeminaireAA3-PStockingerAaR
SeminaireAA3-PStockingerAaRSeminaireAA3-PStockingerAaR
SeminaireAA3-PStockingerAaRConsortiumArcMC
 
Cop21 livret-rac-france
Cop21 livret-rac-franceCop21 livret-rac-france
Cop21 livret-rac-franceRAC-F
 
Oxy56 78 frugyu
Oxy56 78 frugyuOxy56 78 frugyu
Oxy56 78 frugyuGBAUDINAT
 

Viewers also liked (20)

A3 distrib fetes de fin d'annee 2013
A3 distrib   fetes de fin d'annee 2013A3 distrib   fetes de fin d'annee 2013
A3 distrib fetes de fin d'annee 2013
 
Formation en ligne, nouvelles pratiques pédagogiques &Moocs
Formation en ligne, nouvelles pratiques pédagogiques &MoocsFormation en ligne, nouvelles pratiques pédagogiques &Moocs
Formation en ligne, nouvelles pratiques pédagogiques &Moocs
 
C&rsquo;est Skaistkalne
C&rsquo;est SkaistkalneC&rsquo;est Skaistkalne
C&rsquo;est Skaistkalne
 
Power point (carrière informatique) a rendre
 Power point (carrière informatique) a rendre  Power point (carrière informatique) a rendre
Power point (carrière informatique) a rendre
 
Le pavillon Paul livret accueil
Le pavillon Paul livret accueilLe pavillon Paul livret accueil
Le pavillon Paul livret accueil
 
Vivre en Martinique - L'attractivité de la Martinique
Vivre en Martinique - L'attractivité de la MartiniqueVivre en Martinique - L'attractivité de la Martinique
Vivre en Martinique - L'attractivité de la Martinique
 
Marketing multicanal cmd
Marketing multicanal cmdMarketing multicanal cmd
Marketing multicanal cmd
 
Joue avec m'oie
Joue avec m'oieJoue avec m'oie
Joue avec m'oie
 
Emailing - Connaître vos clients pour mieux communiquer : exemple avec Mr.Bri...
Emailing - Connaître vos clients pour mieux communiquer : exemple avec Mr.Bri...Emailing - Connaître vos clients pour mieux communiquer : exemple avec Mr.Bri...
Emailing - Connaître vos clients pour mieux communiquer : exemple avec Mr.Bri...
 
WeKeyPedia pitch @ SoData
WeKeyPedia pitch @ SoDataWeKeyPedia pitch @ SoData
WeKeyPedia pitch @ SoData
 
Chloe charce etc96
Chloe charce etc96Chloe charce etc96
Chloe charce etc96
 
Bière sante et astuces
Bière sante et astucesBière sante et astuces
Bière sante et astuces
 
Catalogue original 1963
 Catalogue original 1963 Catalogue original 1963
Catalogue original 1963
 
Carrière informatique sam savoie
Carrière informatique  sam savoieCarrière informatique  sam savoie
Carrière informatique sam savoie
 
SeminaireAA3-PStockingerAaR
SeminaireAA3-PStockingerAaRSeminaireAA3-PStockingerAaR
SeminaireAA3-PStockingerAaR
 
Cop21 livret-rac-france
Cop21 livret-rac-franceCop21 livret-rac-france
Cop21 livret-rac-france
 
Oxy56 78 frugyu
Oxy56 78 frugyuOxy56 78 frugyu
Oxy56 78 frugyu
 
Jeu de la vie
Jeu de la vieJeu de la vie
Jeu de la vie
 
Ecole Numérique
Ecole NumériqueEcole Numérique
Ecole Numérique
 
Pas de petit déjeuner ?
Pas de petit déjeuner ?Pas de petit déjeuner ?
Pas de petit déjeuner ?
 

Similar to PostgreSQL Meetup Nantes #2

Le futur d'apache cassandra
Le futur d'apache cassandraLe futur d'apache cassandra
Le futur d'apache cassandraDuyhai Doan
 
Telecharger Exercices corrigés sqlplus
Telecharger Exercices corrigés sqlplusTelecharger Exercices corrigés sqlplus
Telecharger Exercices corrigés sqlpluswebreaker
 
Traitement des données massives (INF442, A2)
Traitement des données massives (INF442, A2)Traitement des données massives (INF442, A2)
Traitement des données massives (INF442, A2)Frank Nielsen
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanMicrosoft
 
Monitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaPatrick Allaert
 
SdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireSdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireAlexandru Radovici
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++cppfrug
 
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosSaid Benaissa
 
Mariadb pour les developpeurs - OSDC
Mariadb pour les developpeurs - OSDCMariadb pour les developpeurs - OSDC
Mariadb pour les developpeurs - OSDCChristophe Villeneuve
 
Spark Streaming
Spark StreamingSpark Streaming
Spark StreamingPALO IT
 
50 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 850 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 8José Paumard
 
BBL - Monitoring - kyriba
BBL - Monitoring - kyribaBBL - Monitoring - kyriba
BBL - Monitoring - kyribaOlivier BAZOUD
 

Similar to PostgreSQL Meetup Nantes #2 (20)

Le futur d'apache cassandra
Le futur d'apache cassandraLe futur d'apache cassandra
Le futur d'apache cassandra
 
Apache Beam
Apache Beam Apache Beam
Apache Beam
 
Telecharger Exercices corrigés sqlplus
Telecharger Exercices corrigés sqlplusTelecharger Exercices corrigés sqlplus
Telecharger Exercices corrigés sqlplus
 
Hello mongo
Hello mongoHello mongo
Hello mongo
 
Traitement des données massives (INF442, A2)
Traitement des données massives (INF442, A2)Traitement des données massives (INF442, A2)
Traitement des données massives (INF442, A2)
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet Spartan
 
Config ip
Config ipConfig ip
Config ip
 
Patron observer
Patron observerPatron observer
Patron observer
 
Monitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et Pinba
 
SdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireSdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoire
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
 
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
 
SdE2 - Planification, IPC
SdE2 - Planification, IPCSdE2 - Planification, IPC
SdE2 - Planification, IPC
 
Mariadb pour les developpeurs - OSDC
Mariadb pour les developpeurs - OSDCMariadb pour les developpeurs - OSDC
Mariadb pour les developpeurs - OSDC
 
Pgbackrest meetup
Pgbackrest meetupPgbackrest meetup
Pgbackrest meetup
 
Spark Streaming
Spark StreamingSpark Streaming
Spark Streaming
 
50 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 850 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 8
 
BBL - Monitoring - kyriba
BBL - Monitoring - kyribaBBL - Monitoring - kyriba
BBL - Monitoring - kyriba
 
Corrige_partie_ADM.pdf
Corrige_partie_ADM.pdfCorrige_partie_ADM.pdf
Corrige_partie_ADM.pdf
 
Python + ansible = ♥
Python + ansible = ♥Python + ansible = ♥
Python + ansible = ♥
 

More from Rodolphe Quiédeville

More from Rodolphe Quiédeville (14)

Tests unitaires pour PostgreSQL avec pgTap
Tests unitaires pour PostgreSQL avec pgTapTests unitaires pour PostgreSQL avec pgTap
Tests unitaires pour PostgreSQL avec pgTap
 
Tsung de 1 à 1 million / Confoo Montréal 2015
Tsung de 1 à 1 million / Confoo Montréal 2015Tsung de 1 à 1 million / Confoo Montréal 2015
Tsung de 1 à 1 million / Confoo Montréal 2015
 
Confoo django
Confoo djangoConfoo django
Confoo django
 
BBL Données gégraphiques libres chez Work4labs
BBL Données gégraphiques libres chez Work4labsBBL Données gégraphiques libres chez Work4labs
BBL Données gégraphiques libres chez Work4labs
 
Tsung GIS
Tsung GISTsung GIS
Tsung GIS
 
BBL autour de PostgreSQL @Novapost
BBL autour de PostgreSQL @NovapostBBL autour de PostgreSQL @Novapost
BBL autour de PostgreSQL @Novapost
 
BBL chez Mappy autour de Tsung
BBL chez Mappy autour de TsungBBL chez Mappy autour de Tsung
BBL chez Mappy autour de Tsung
 
Un Tsung vaut mieux que 2 "croisons les doigts"
Un Tsung vaut mieux que 2 "croisons les doigts"Un Tsung vaut mieux que 2 "croisons les doigts"
Un Tsung vaut mieux que 2 "croisons les doigts"
 
OpenStreetMap Realtime Check
OpenStreetMap Realtime CheckOpenStreetMap Realtime Check
OpenStreetMap Realtime Check
 
Présentation de Tsung chez Leboncoin
Présentation de Tsung chez LeboncoinPrésentation de Tsung chez Leboncoin
Présentation de Tsung chez Leboncoin
 
de 1 à 1 million avec Tsung
de 1 à 1 million avec Tsungde 1 à 1 million avec Tsung
de 1 à 1 million avec Tsung
 
Tests de performance avec Tsung
Tests de performance avec TsungTests de performance avec Tsung
Tests de performance avec Tsung
 
Asterisk
AsteriskAsterisk
Asterisk
 
Tests de montée en charge avec Tsung
Tests de montée en charge avec TsungTests de montée en charge avec Tsung
Tests de montée en charge avec Tsung
 

PostgreSQL Meetup Nantes #2

  • 1. DBA au service du développeur Rodolphe Quiédeville Meetup PostgreSQL Nantes 26 avril 2016
  • 2. #mylife Découvert Internet à 28.kbits avec Netscape Navigator Utilise et produit du logiciel libre exclusivement PostgreSQL depuis ... la 6.X ? Consultant en performance des SI(G) Senior Performance Engineer @PeopleDoc Formateur Upstream University
  • 3. SQL
  • 4. ORM
  • 5. Cas concret Une observation du nombre d’oiseaux dans un espace fini toutes les 5 minutes Table ‘‘public.observation’’ Column | Type | Modifiers ----------+-----------------------------+--------------- obs_date | timestamp without time zone | default now() duration | integer | birds | integer |
  • 6. Cas concret Table des observations pocpipe# select * from obs2 limit 5 ; obs_date | duration | birds ---------------------+----------+------- 2000-01-01 00:00:00 | 4 | 67 2000-01-01 00:05:00 | 6 | 194 2000-01-01 00:10:00 | 17 | 273 2000-01-01 00:15:00 | 10 | 149 2000-01-01 00:20:00 | 4 | 77
  • 8. Exploitation des données SELECT date_part ( ’ year ’ , obs_date ) , sum( birds ) : : f l o a t / sum( duration ) : : f l o a t FROM observation GROUP BY 1 ORDER BY 1 ASC ;
  • 9. Non scalabilité Le temps de réponse dépend du volume de données
  • 10. Non scalabilité Le temps de réponse dépend du volume de données 1 an de données 91 msec
  • 11. Non scalabilité Le temps de réponse dépend du volume de données 1 an de données 91 msec 4 ans de données 523 msec
  • 12. Non scalabilité Le temps de réponse dépend du volume de données 1 an de données 91 msec 4 ans de données 523 msec 12 ans de données 1495 msec
  • 13. Mélange de données Pour un graphique temps réel avec un historique conséquent
  • 14. Mélange de données Pour un graphique temps réel avec un historique conséquent donnée froide (1,7M de tuples)
  • 15. Mélange de données Pour un graphique temps réel avec un historique conséquent donnée froide (1,7M de tuples) donnée chaude (toutes les 5 min)
  • 16. Exploitation des données SELECT date_part ( ’ year ’ , obs_date ) , sum( birds ) : : f l o a t / sum( duration ) : : f l o a t FROM observation GROUP BY 1 ORDER BY 1 ASC ;
  • 17. Exploitation des données Gérer les données froides CREATE MATERIALIZED VIEW observation_past AS SELECT date_part ( ’ year ’ , obs_date ) AS obs_year , SUM( birds ) : : f l o a t / SUM( duration ) : : f l o a t AS birds_per_hour FROM observation WHERE date_part ( ’ year ’ , obs_date ) : : i n t < 2016 GROUP BY 1; Time : 1275.701 ms
  • 18. Exploitation des données froides pocpipe# SELECT * FROM observation_past WHERE obs_year > 2010 ORDER BY obs_year; obs_year | birds_per_hour ----------+------------------ 2011 | 16.6410914009205 2012 | 16.6371300227029 2013 | 16.6985043384672 2014 | 16.6309208305199 2015 | 16.6618262419789 (5 rows) Time: 0.609 ms
  • 19. Exploitation des données chaudes un peu plus complexe appel à une solution extérieure
  • 21. Le stream Créer un stream pour alimenter la base CREATE STREAM observations ( obs_date timestamp , duration int , birds i n t ) ;
  • 22. La vue Créer une vue pour consulter les données CREATE CONTINUOUS VIEW observation_now AS SELECT date_part ( ’ year ’ , obs_date ) AS obs_year , SUM( duration ) : : f l o a t AS sum_duration , SUM( birds ) : : f l o a t AS sum_birds FROM observations WHERE date_part ( ’ year ’ , obs_date ) >= 2016 GROUP BY date_part ( ’ year ’ , obs_date ) ;
  • 23. Le DBA au service du développeur On va jouer à domicile : CREATE EXTENSION postgres_fdw ; CREATE SERVER foreign_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS ( host ’ 127.0.0.1 ’ , port ’ 9203 ’ , dbname ’ p ip el ine ’ ) ; CREATE USER MAPPING FOR rodo SERVER foreign_server OPTIONS ( user ’ p ip eli ne ’ , password ’ pi pel in e ’ ) ;
  • 24. Le DBA au service du développeur La table locale pour alimenter le stream CREATE FOREIGN TABLE observation_stream ( obs_date timestamp , duration int , birds i n t ) SERVER foreign_server OPTIONS ( schema_name ’ public ’ , table_name ’ observations ’ , updatable ’ true ’ ) ;
  • 25. Le DBA au service du développeur La table locale pour récupérer les données CREATE FOREIGN TABLE observation_now ( obs_year int , sum_duration int , sum_birds i n t ) SERVER foreign_server OPTIONS ( schema_name ’ public ’ , table_name ’ observation_now ’ , updatable ’ false ’ ) ;
  • 26. Toujours vide pocpipe# select * from observation_now ; obs_year | sum_duration | sum_birds ----------+--------------+----------- (0 rows)
  • 27. Alimentons pipelinedb On va automatiser l’alimentation CREATE OR REPLACE FUNCTION observation_feed_stream ( ) RETURNS TRIGGER AS $BODY$ BEGIN INSERT INTO observation_stream VALUES (NEW. obs_date , NEW. duration , NEW. birds ) ; RETURN NEW; END; $BODY$ LANGUAGE plpgsql ; CREATE TRIGGER observation_trigger AFTER INSERT ON observation FOR EACH ROW EXECUTE PROCEDURE observation_feed_stream ( ) ;
  • 28. Alimentons pipelinedb Reprise d’historique INSERT INTO observation_stream (SELECT ∗ FROM observation where date_part ( ’ year ’ , obs_date ) = 2016 ) ; INSERT 0 33409
  • 29. Toujours vide ? pocpipe# select * from observation_now ; obs_year | sum_duration | sum_birds ----------+--------------+----------- 2016 | 299864 | 5010160 (1 row) Time: 4.179 ms
  • 30. Toujours vide ? pocpipe# select * from observation_now ; obs_year | sum_duration | sum_birds ----------+--------------+----------- 2016 | 299864 | 5010160 (1 row) Time: 4.179 ms pocpipe# INSERT INTO observation VALUES (now(), 30, 200); INSERT 0 1 Time: 9.904 ms
  • 31. Toujours vide ? pocpipe# select * from observation_now ; obs_year | sum_duration | sum_birds ----------+--------------+----------- 2016 | 299864 | 5010160 (1 row) Time: 4.179 ms pocpipe# INSERT INTO observation VALUES (now(), 30, 200); INSERT 0 1 Time: 9.904 ms pocpipe# select * from observation_now ; obs_year | sum_duration | sum_birds ----------+--------------+----------- 2016 | 299894 | 5010360 (1 row) Time: 1.194 ms
  • 32. One Shot Dernière vue CREATE OR REPLACE VIEW observation_all AS WITH cte AS ( SELECT obs_year , birds_per_hour FROM observation_past UNION ALL SELECT obs_year , sum_birds : : f l o a t / sum_duration : : f l o a t AS birds_per_hour FROM observation_now ) SELECT obs_year , birds_per_hour FROM cte ;
  • 33. Badoum Ba ! pocpipe# select * from observation_all order by 1; obs_year | birds_per_hour ----------+------------------ 2000 | 16.6203813775456 2001 | 16.6695899394653 2002 | 16.6471423597847 2003 | 16.5756814747212 2004 | 16.6575399685407 2005 | 16.6397299509002 2006 | 16.6371339270242 2007 | 16.6560480162363 2008 | 16.6965677534587 2009 | 16.6812852231278 2010 | 16.6404274047321 2011 | 16.6410914009205 2012 | 16.6371300227029 2013 | 16.6985043384672 2014 | 16.6309208305199 2015 | 16.6618262419789 2016 | 16.7081076754795 (17 rows) Time: 4.211 ms
  • 34. En résumé On remplace une table par une vue et SELECT date_part ( ’ year ’ , obs_date ) AS obs_year , SUM( birds ) : : f l o a t / SUM( duration ) : : f l o a t AS birds_per_hour FROM observation GROUP BY 1; par SELECT obs_year , birds_per_hour FROM observation_all ;
  • 35. En résumé Temps de requête passe de 2723 ms à 1.962 ms