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
PostgreSQ...
SQL
ORM
Cas concret
Une observation du nombre d’oiseaux dans un espace fini
toutes les 5 minutes
Table ‘‘public.observation’’
Colum...
Cas concret
Table des observations
pocpipe# select * from obs2 limit 5 ;
obs_date | duration | birds
---------------------...
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...
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 d...
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...
Exploitation des données
SELECT
date_part ( ’ year ’ , obs_date ) ,
sum( birds ) : : f l o a t / sum( duration ) : : f l o...
Exploitation des données
Gérer les données froides
CREATE MATERIALIZED VIEW observation_past AS
SELECT
date_part ( ’ year ...
Exploitation des données froides
pocpipe#
SELECT * FROM observation_past
WHERE obs_year > 2010 ORDER BY obs_year;
obs_year...
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 ...
La vue
Créer une vue pour consulter les données
CREATE CONTINUOUS VIEW observation_now AS
SELECT date_part ( ’ year ’ , ob...
Le DBA au service du développeur
On va jouer à domicile :
CREATE EXTENSION postgres_fdw ;
CREATE SERVER foreign_server
FOR...
Le DBA au service du développeur
La table locale pour alimenter le stream
CREATE FOREIGN TABLE observation_stream (
obs_da...
Le DBA au service du développeur
La table locale pour récupérer les données
CREATE FOREIGN TABLE observation_now (
obs_yea...
Toujours vide
pocpipe# select * from observation_now ;
obs_year | sum_duration | sum_birds
----------+--------------+-----...
Alimentons pipelinedb
On va automatiser l’alimentation
CREATE OR REPLACE FUNCTION observation_feed_stream ( )
RETURNS TRIG...
Alimentons pipelinedb
Reprise d’historique
INSERT INTO observation_stream
(SELECT ∗ FROM observation where
date_part ( ’ y...
Toujours vide ?
pocpipe# select * from observation_now ;
obs_year | sum_duration | sum_birds
----------+--------------+---...
Toujours vide ?
pocpipe# select * from observation_now ;
obs_year | sum_duration | sum_birds
----------+--------------+---...
Toujours vide ?
pocpipe# select * from observation_now ;
obs_year | sum_duration | sum_birds
----------+--------------+---...
One Shot
Dernière vue
CREATE OR REPLACE VIEW observation_all AS
WITH cte AS (
SELECT obs_year , birds_per_hour FROM observ...
Badoum Ba !
pocpipe# select * from observation_all order by 1;
obs_year | birds_per_hour
----------+------------------
200...
En résumé
On remplace une table par une vue
et
SELECT
date_part ( ’ year ’ , obs_date ) AS obs_year ,
SUM( birds ) : : f l...
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...
Prochain SlideShare
Chargement dans…5
×

PostgreSQL Meetup Nantes #2

448 vues

Publié le

How to use PipelineDB to be a DBA in love with the developper

Publié dans : Technologie
  • Soyez le premier à commenter

PostgreSQL Meetup Nantes #2

  1. 1. DBA au service du développeur Rodolphe Quiédeville Meetup PostgreSQL Nantes 26 avril 2016
  2. 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. 3. SQL
  4. 4. ORM
  5. 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. 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
  7. 7. Exploitation des données
  8. 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. 9. Non scalabilité Le temps de réponse dépend du volume de données
  10. 10. Non scalabilité Le temps de réponse dépend du volume de données 1 an de données 91 msec
  11. 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. 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. 13. Mélange de données Pour un graphique temps réel avec un historique conséquent
  14. 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. 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. 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. 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. 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. 19. Exploitation des données chaudes un peu plus complexe appel à une solution extérieure
  20. 20. PipelineDB www.pipelinedb.com PostgreSQL Compatible Continuous Aggregations Sliding Window Queries ...
  21. 21. Le stream Créer un stream pour alimenter la base CREATE STREAM observations ( obs_date timestamp , duration int , birds i n t ) ;
  22. 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. 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. 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. 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. 26. Toujours vide pocpipe# select * from observation_now ; obs_year | sum_duration | sum_birds ----------+--------------+----------- (0 rows)
  27. 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. 28. Alimentons pipelinedb Reprise d’historique INSERT INTO observation_stream (SELECT ∗ FROM observation where date_part ( ’ year ’ , obs_date ) = 2016 ) ; INSERT 0 33409
  29. 29. Toujours vide ? pocpipe# select * from observation_now ; obs_year | sum_duration | sum_birds ----------+--------------+----------- 2016 | 299864 | 5010160 (1 row) Time: 4.179 ms
  30. 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. 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. 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. 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. 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. 35. En résumé Temps de requête passe de 2723 ms à 1.962 ms
  36. 36. Questions ? Rodolphe Quiédeville rodolphe.quiedeville@people-doc.com Document publié sous Licence Creative Commons BY-SA 2.0

×