SlideShare une entreprise Scribd logo
1  sur  33
POSTGRESQL CHEZ LENGOW
Quand un poney rencontre un éléphant
Mickael Le Baillif, Guillaume Stoffer
Meetup PostgreSQL Nantes #2
2016-04-26
NOTRE METIER
2
NOTRE
METIER
3
Lengow : Un écosystème dédié au e-commerce
NOS BESOINS
EN BDD
4
NOS
BESOINS EN
BDD
 Un très grand volume de
données estimé à 250
milliards de produits indexés
par an
 Une très grande diversité
des sources en entrée
(langage, format, structure)
5
NOS
BESOINS EN
BDD
 Une très grande diversité
des diffuseurs en sortie
(format attendu exotique)
 La possibilité de manipuler
un catalogue marchand en
profondeur en toute sécurité
6
ARCHITECTURE
POSTGRESQL
7
QU’Y A-
T-IL
SOUS LE
CAPOT ?
ARCHITECTURE
MATERIELLE
9
Serveur physique
ARCHITECTURE
MATERIELLE
10
Processeurs
multi-coeurs
ARCHITECTURE
MATERIELLE
11
Données “chaudes”
intégralement en RAM
ARCHITECTURE
MATERIELLE
12
Persistence disque
sur SSD
ET SI ÇA
CRASHE
?
RÉPLICATION
ET HAUTE
DISPONIBILITÉ
14
Datacenter 1 Datacenter 2
WAL shipping
WALshipping
WALshipping
RÉPLICATION
ET HAUTE
DISPONIBILITÉ
15
@IP virtuelle RW
@IP virtuelle RO
ARCHITECTURE
LOGIQUE
16
JSONB
XML
CSV
JSON
…
XML
CSV
JSON
Marchands
Diffuseurs
IMPLÉMENTATIONS
INTÉRESSANTES
17
XML ET
XPATH
18
Extraction de données utiles
dans des documents XML
directement à partir de
requêtes SQL
XML ET
XPATH
19 La structure du fichier à envoyer aux diffuseurs est
spécifiée en XML
<?xml version="1.0" encoding="UTF-8"?>
<group name="Product" foreach="product" main_products_node="true">
<csv_param name="delimiter" value="|" />
<csv_param name="quotechar" value="" />
<field id="1" type="string" use="required" name="EAN"/>
<field id="2" type="string" use="required" name="Titre"/>
<field id="3" type="string" use="required" name="Marque"/>
<field id="4" type="string" use="required" name="Prix HT"/>
<field id="5" type="string" use="required" name="Prix TTC"/>
<field id="6" type="string" use="required" name="Frais port"/>
</group>
XML ET
XPATH
20 La structure du fichier à envoyer aux diffuseurs est
spécifiée en XML
<?xml version="1.0" encoding="UTF-8"?>
<group name="Product" foreach="product" main_products_node="true">
<csv_param name="delimiter" value="|" />
<csv_param name="quotechar" value="" />
<field id="1" type="string" use="required" name="EAN"/>
<field id="2" type="string" use="required" name="Titre"/>
<field id="3" type="string" use="required" name="Marque"/>
<field id="4" type="string" use="required" name="Prix HT"/>
<field id="5" type="string" use="required" name="Prix TTC"/>
<field id="6" type="string" use="required" name="Frais port"/>
</group>
JSON
EAN Titre Marqu
e
Prix HT Prix
TTC
Frais
port
[
{
"EAN": "...",
"Titre": "...",
"Marque": "...",
"Prix HT": 2,
"Prix TTC": 3,
"Frais port": 1
}
]
<?xml version="1.0" encoding="UTF-8"?>
<Products>
<Product>
<EAN>...</EAN>
<Titre>...</Titre>
<Marque>...</Marque>
<Prix_HT>...</Prix_HT>
<Prix_TTC>...</Prix_TTC>
<Frais_port>...</Frais_port>
</Product>
</Products>
XML ET
XPATH
21
XML ET
XPATH
22
<?xml version="1.0" encoding="UTF-8"?>
<group name="Product" foreach="product" main_products_node="true">
<csv_param name="delimiter" value="|" />
<csv_param name="quotechar" value="" />
<field id="1" type="string" use="required" name="EAN"/>
<field id="2" type="string" use="required" name="Titre"/>
<field id="3" type="string" use="required" name="Marque"/>
<field id="4" type="string" use="required" name="Prix HT"/>
<field id="5" type="string" use="required" name="Prix TTC"/>
<field id="6" type="string" use="required" name="Frais port"/>
</group>
WITH fields AS
(SELECT unnest(xpath('//field', schema_definition)) AS f
FROM channel.structure
WHERE id = 915)
SELECT unnest(xpath('@id', f)) AS id,
unnest(xpath('@name', f)) AS name,
unnest(xpath('@use', f))::text = 'required' AS required
FROM fields
XML ET
XPATH
23
<?xml version="1.0" encoding="UTF-8"?>
<group name="Product" foreach="product" main_products_node="true">
<csv_param name="delimiter" value="|" />
<csv_param name="quotechar" value="" />
<field id="1" type="string" use="required" name="EAN"/>
<field id="2" type="string" use="required" name="Titre"/>
<field id="3" type="string" use="required" name="Marque"/>
<field id="4" type="string" use="required" name="Prix HT"/>
<field id="5" type="string" use="required" name="Prix TTC"/>
<field id="6" type="string" use="required" name="Frais port"/>
</group>
WITH fields AS
(SELECT unnest(xpath('//field', schema_definition)) AS f
FROM channel.structure
WHERE id = 915)
SELECT unnest(xpath('@id', f)) AS id,
unnest(xpath('@name', f)) AS name,
unnest(xpath('@use', f))::text = 'required' AS required
FROM fields
f
<field id="1" type="string" use="required" name="EAN"/>
<field id="2" type="string" use="required" name="Titre Produit"/>
<field id="3" type="string" use="required" name="Marque"/>
<field id="4" type="string" use="required" name="Prix HT"/>
XML ET
XPATH
24
<?xml version="1.0" encoding="UTF-8"?>
<group name="Product" foreach="product" main_products_node="true">
<csv_param name="delimiter" value="|" />
<csv_param name="quotechar" value="" />
<field id="1" type="string" use="required" name="EAN"/>
<field id="2" type="string" use="required" name="Titre"/>
<field id="3" type="string" use="required" name="Marque"/>
<field id="4" type="string" use="required" name="Prix HT"/>
<field id="5" type="string" use="required" name="Prix TTC"/>
<field id="6" type="string" use="required" name="Frais port"/>
</group>
WITH fields AS
(SELECT unnest(xpath('//field', schema_definition)) AS f
FROM channel.structure
WHERE id = 915)
SELECT unnest(xpath('@id', f)) AS id,
unnest(xpath('@name', f)) AS name,
unnest(xpath('@use', f))::text = 'required' AS required
FROM fields
id name required
1 EAN t
2 Titre Produit t
3 Marque t
4 Prix HT t
SYSTEM
VERSION
25
 Standard SQL 2011
 Extension Temporal Tables
 Procédure versioning()
 Colonne type tstzrange
 Synergie avec l'héritage de
table
26
Utilisation de triggers pour
indexer les champs essentiels
dans du contenu JSON
TRIGGERS
D’INDEXATION
TRIGGERS
D’INDEXATION
27
Cas traditionnel : données structurées
SKU name price stock color
99_B33W Blue Shoes 64.99 6 blue
54_A23B Umbrella 19.99 55 black
11_R22F AiePhone 45.55 1200 white
98_N26T Chair 63.00 8 null
TRIGGERS
D’INDEXATION
28
Stockage JSON : données fusionnées
dans une seule colonne
id attributes
101 {‘SKU’: ’99_B33W’, ‘name’: ‘Blue Shoes’, ’price’: 64.99 …}
106 {‘SKU’: ’54_A23B’, ‘name’: ‘Umbrella’, ’price’: 19.99 …}
115 {‘SKU’: ’11_R22F’, ‘name’: ‘AiePhone’, ’price’: 45.55 …}
132 {‘SKU’: ’98_N26T’, ‘name’: ‘Chair’, ’price’: 63 …}
SKU name price stock color
99_B33W Blue Shoes 64.99 6 blue
54_A23B Umbrella 19.99 55 black
11_R22F AiePhone 45.55 1200 white
98_N26T Chair 63.00 8 null
TRIGGERS
D’INDEXATION
29
catalog_198
id_catalog mapping
198 {‘id’: ‘SKU’, ‘prix’: ‘price’, ‘titre’: ‘name’, … }
catalog_format
CREATE TRIGGER xxx after INSERT
OR UPDATE OF mapping
ON catalog_format
id attributes
101 {‘SKU’: ’99_B33W’, ‘name’: ‘Blue Shoes’, ’price’: 64.99 …}
106 {‘SKU’: ’54_A23B’, ‘name’: ‘Umbrella’, ’price’: 19.99 …}
115 {‘SKU’: ’11_R22F’, ‘name’: ‘AiePhone’, ’price’: 45.55 …}
132 {‘SKU’: ’98_N26T’, ‘name’: ‘Chair’, ’price’: 63 …}
create index on catalog_198
using btree(attributes->>’SKU’)
TRIGGERS
D’INDEXATION
30
create index on catalog_198
using GIN (attributes)
Va indexer toutes les propriétés d’un produit, trop
volumineux et coûteux
SELECT attributes
FROM catalog_198
WHERE attributes @> ’{"SKU”: "54_A23B”}’
catalog_198
id attributes
101 {‘SKU’: ’99_B33W’, ‘name’: ‘Blue Shoes’, ’price’: 64.99 …}
106 {‘SKU’: ’54_A23B’, ‘name’: ‘Umbrella’, ’price’: 19.99 …}
115 {‘SKU’: ’11_R22F’, ‘name’: ‘AiePhone’, ’price’: 45.55 …}
132 {‘SKU’: ’98_N26T’, ‘name’: ‘Chair’, ’price’: 63 …}
ET POUR
PLUS TARD …
31
PROJETS
FUTURS
▸Création d'index asynchrone avec
PGQ
▹Ne pas bloquer lors du changement de
mapping d’un catalogue
▸Parallélisation des requêtes sur nos
4 serveurs (Citus DB ?)
▹Chaque serveur peut scanner ¼ de la table
▸TABLESAMPLE + cache
▹Estimer très rapidement un résultat sur un
échantillon, puis lancer le calcul complet qui
sera mis en cache
32
MERCI
MERCI
Des questions ?
Contact :
 mickael.le.baillif@gmail.com
 guillaume.stoffer@gmail.com

Contenu connexe

En vedette

Live streaming of video and subtitles with MPEG-DASH
Live streaming of video and subtitles with MPEG-DASHLive streaming of video and subtitles with MPEG-DASH
Live streaming of video and subtitles with MPEG-DASHCyril Concolato
 
Sakarya Üniversitesi "Tasarımın Evrimi" Sunumu
Sakarya Üniversitesi "Tasarımın Evrimi" SunumuSakarya Üniversitesi "Tasarımın Evrimi" Sunumu
Sakarya Üniversitesi "Tasarımın Evrimi" SunumuVatanay Özbeyli
 
Q921 de2 lec5 v1
Q921 de2 lec5 v1Q921 de2 lec5 v1
Q921 de2 lec5 v1AFATous
 
[Trends]14 trend researchiv
[Trends]14 trend researchiv[Trends]14 trend researchiv
[Trends]14 trend researchivJY LEE
 
Building a Universal Ferrule for Bamboo Fly Rods
Building a Universal Ferrule for Bamboo Fly Rods Building a Universal Ferrule for Bamboo Fly Rods
Building a Universal Ferrule for Bamboo Fly Rods sabbarnhart
 
The Seismic Behaviour of Semi continuous Bridges – A State of the Art Bridge ...
The Seismic Behaviour of Semi continuous Bridges – A State of the Art Bridge ...The Seismic Behaviour of Semi continuous Bridges – A State of the Art Bridge ...
The Seismic Behaviour of Semi continuous Bridges – A State of the Art Bridge ...AM Publications
 
Ventes en ligne cross-border en Europe : quels enjeux pour les moyens de paie...
Ventes en ligne cross-border en Europe : quels enjeux pour les moyens de paie...Ventes en ligne cross-border en Europe : quels enjeux pour les moyens de paie...
Ventes en ligne cross-border en Europe : quels enjeux pour les moyens de paie...Lengow
 

En vedette (9)

Live streaming of video and subtitles with MPEG-DASH
Live streaming of video and subtitles with MPEG-DASHLive streaming of video and subtitles with MPEG-DASH
Live streaming of video and subtitles with MPEG-DASH
 
Sakarya Üniversitesi "Tasarımın Evrimi" Sunumu
Sakarya Üniversitesi "Tasarımın Evrimi" SunumuSakarya Üniversitesi "Tasarımın Evrimi" Sunumu
Sakarya Üniversitesi "Tasarımın Evrimi" Sunumu
 
Q921 de2 lec5 v1
Q921 de2 lec5 v1Q921 de2 lec5 v1
Q921 de2 lec5 v1
 
[Trends]14 trend researchiv
[Trends]14 trend researchiv[Trends]14 trend researchiv
[Trends]14 trend researchiv
 
Basics of drilling 2
Basics of drilling 2Basics of drilling 2
Basics of drilling 2
 
Basics of drilling 3
Basics of drilling 3Basics of drilling 3
Basics of drilling 3
 
Building a Universal Ferrule for Bamboo Fly Rods
Building a Universal Ferrule for Bamboo Fly Rods Building a Universal Ferrule for Bamboo Fly Rods
Building a Universal Ferrule for Bamboo Fly Rods
 
The Seismic Behaviour of Semi continuous Bridges – A State of the Art Bridge ...
The Seismic Behaviour of Semi continuous Bridges – A State of the Art Bridge ...The Seismic Behaviour of Semi continuous Bridges – A State of the Art Bridge ...
The Seismic Behaviour of Semi continuous Bridges – A State of the Art Bridge ...
 
Ventes en ligne cross-border en Europe : quels enjeux pour les moyens de paie...
Ventes en ligne cross-border en Europe : quels enjeux pour les moyens de paie...Ventes en ligne cross-border en Europe : quels enjeux pour les moyens de paie...
Ventes en ligne cross-border en Europe : quels enjeux pour les moyens de paie...
 

Similaire à Utilisation de PostgreSQL chez Lengow

Telecharger Exercices corrigés sqlplus
Telecharger Exercices corrigés sqlplusTelecharger Exercices corrigés sqlplus
Telecharger Exercices corrigés sqlpluswebreaker
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JSAntoine Rey
 
Journées ABES 2014 - Focus sur la plateforme Istex
Journées ABES 2014 - Focus sur la plateforme IstexJournées ABES 2014 - Focus sur la plateforme Istex
Journées ABES 2014 - Focus sur la plateforme IstexABES
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewLudovic Piot
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide
 
Présentation de ElasticSearch / Digital apéro du 12/11/2014
Présentation de ElasticSearch / Digital apéro du 12/11/2014Présentation de ElasticSearch / Digital apéro du 12/11/2014
Présentation de ElasticSearch / Digital apéro du 12/11/2014Silicon Comté
 
Principes Relationnels et Concepts Oracle
Principes Relationnelset Concepts OraclePrincipes Relationnelset Concepts Oracle
Principes Relationnels et Concepts Oraclewebreaker
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab ElasticsearchDavid Pilato
 
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
 
Construisez votre première application MongoDB
Construisez votre première application MongoDBConstruisez votre première application MongoDB
Construisez votre première application MongoDBMongoDB
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLHervé Leclerc
 
Slides de la Localisation
Slides de la LocalisationSlides de la Localisation
Slides de la LocalisationCocoaHeads.fr
 
Digital GraphTour Paris - Neo4j 4.0, les nouveautés
Digital GraphTour Paris - Neo4j 4.0, les nouveautésDigital GraphTour Paris - Neo4j 4.0, les nouveautés
Digital GraphTour Paris - Neo4j 4.0, les nouveautésNeo4j
 
Elasticsearch - Esme sudria
Elasticsearch - Esme sudriaElasticsearch - Esme sudria
Elasticsearch - Esme sudriaDavid Pilato
 
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
 

Similaire à Utilisation de PostgreSQL chez Lengow (20)

Chapitre 2
Chapitre 2Chapitre 2
Chapitre 2
 
Telecharger Exercices corrigés sqlplus
Telecharger Exercices corrigés sqlplusTelecharger Exercices corrigés sqlplus
Telecharger Exercices corrigés sqlplus
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JS
 
Journées ABES 2014 - Focus sur la plateforme Istex
Journées ABES 2014 - Focus sur la plateforme IstexJournées ABES 2014 - Focus sur la plateforme Istex
Journées ABES 2014 - Focus sur la plateforme Istex
 
Adopte une BDD
Adopte une BDDAdopte une BDD
Adopte une BDD
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overview
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic Search
 
Présentation de ElasticSearch / Digital apéro du 12/11/2014
Présentation de ElasticSearch / Digital apéro du 12/11/2014Présentation de ElasticSearch / Digital apéro du 12/11/2014
Présentation de ElasticSearch / Digital apéro du 12/11/2014
 
Principes Relationnels et Concepts Oracle
Principes Relationnelset Concepts OraclePrincipes Relationnelset Concepts Oracle
Principes Relationnels et Concepts Oracle
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 
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
 
Pg jsonb format 16-9
Pg jsonb format 16-9Pg jsonb format 16-9
Pg jsonb format 16-9
 
Hello mongo
Hello mongoHello mongo
Hello mongo
 
Construisez votre première application MongoDB
Construisez votre première application MongoDBConstruisez votre première application MongoDB
Construisez votre première application MongoDB
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQL
 
Slides de la Localisation
Slides de la LocalisationSlides de la Localisation
Slides de la Localisation
 
Digital GraphTour Paris - Neo4j 4.0, les nouveautés
Digital GraphTour Paris - Neo4j 4.0, les nouveautésDigital GraphTour Paris - Neo4j 4.0, les nouveautés
Digital GraphTour Paris - Neo4j 4.0, les nouveautés
 
Elasticsearch - Esme sudria
Elasticsearch - Esme sudriaElasticsearch - Esme sudria
Elasticsearch - Esme sudria
 
cm-bd.pdf
cm-bd.pdfcm-bd.pdf
cm-bd.pdf
 
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
 

Utilisation de PostgreSQL chez Lengow

  • 1. POSTGRESQL CHEZ LENGOW Quand un poney rencontre un éléphant Mickael Le Baillif, Guillaume Stoffer Meetup PostgreSQL Nantes #2 2016-04-26
  • 3. NOTRE METIER 3 Lengow : Un écosystème dédié au e-commerce
  • 5. NOS BESOINS EN BDD  Un très grand volume de données estimé à 250 milliards de produits indexés par an  Une très grande diversité des sources en entrée (langage, format, structure) 5
  • 6. NOS BESOINS EN BDD  Une très grande diversité des diffuseurs en sortie (format attendu exotique)  La possibilité de manipuler un catalogue marchand en profondeur en toute sécurité 6
  • 14. RÉPLICATION ET HAUTE DISPONIBILITÉ 14 Datacenter 1 Datacenter 2 WAL shipping WALshipping WALshipping
  • 18. XML ET XPATH 18 Extraction de données utiles dans des documents XML directement à partir de requêtes SQL
  • 19. XML ET XPATH 19 La structure du fichier à envoyer aux diffuseurs est spécifiée en XML <?xml version="1.0" encoding="UTF-8"?> <group name="Product" foreach="product" main_products_node="true"> <csv_param name="delimiter" value="|" /> <csv_param name="quotechar" value="" /> <field id="1" type="string" use="required" name="EAN"/> <field id="2" type="string" use="required" name="Titre"/> <field id="3" type="string" use="required" name="Marque"/> <field id="4" type="string" use="required" name="Prix HT"/> <field id="5" type="string" use="required" name="Prix TTC"/> <field id="6" type="string" use="required" name="Frais port"/> </group>
  • 20. XML ET XPATH 20 La structure du fichier à envoyer aux diffuseurs est spécifiée en XML <?xml version="1.0" encoding="UTF-8"?> <group name="Product" foreach="product" main_products_node="true"> <csv_param name="delimiter" value="|" /> <csv_param name="quotechar" value="" /> <field id="1" type="string" use="required" name="EAN"/> <field id="2" type="string" use="required" name="Titre"/> <field id="3" type="string" use="required" name="Marque"/> <field id="4" type="string" use="required" name="Prix HT"/> <field id="5" type="string" use="required" name="Prix TTC"/> <field id="6" type="string" use="required" name="Frais port"/> </group> JSON EAN Titre Marqu e Prix HT Prix TTC Frais port [ { "EAN": "...", "Titre": "...", "Marque": "...", "Prix HT": 2, "Prix TTC": 3, "Frais port": 1 } ] <?xml version="1.0" encoding="UTF-8"?> <Products> <Product> <EAN>...</EAN> <Titre>...</Titre> <Marque>...</Marque> <Prix_HT>...</Prix_HT> <Prix_TTC>...</Prix_TTC> <Frais_port>...</Frais_port> </Product> </Products>
  • 22. XML ET XPATH 22 <?xml version="1.0" encoding="UTF-8"?> <group name="Product" foreach="product" main_products_node="true"> <csv_param name="delimiter" value="|" /> <csv_param name="quotechar" value="" /> <field id="1" type="string" use="required" name="EAN"/> <field id="2" type="string" use="required" name="Titre"/> <field id="3" type="string" use="required" name="Marque"/> <field id="4" type="string" use="required" name="Prix HT"/> <field id="5" type="string" use="required" name="Prix TTC"/> <field id="6" type="string" use="required" name="Frais port"/> </group> WITH fields AS (SELECT unnest(xpath('//field', schema_definition)) AS f FROM channel.structure WHERE id = 915) SELECT unnest(xpath('@id', f)) AS id, unnest(xpath('@name', f)) AS name, unnest(xpath('@use', f))::text = 'required' AS required FROM fields
  • 23. XML ET XPATH 23 <?xml version="1.0" encoding="UTF-8"?> <group name="Product" foreach="product" main_products_node="true"> <csv_param name="delimiter" value="|" /> <csv_param name="quotechar" value="" /> <field id="1" type="string" use="required" name="EAN"/> <field id="2" type="string" use="required" name="Titre"/> <field id="3" type="string" use="required" name="Marque"/> <field id="4" type="string" use="required" name="Prix HT"/> <field id="5" type="string" use="required" name="Prix TTC"/> <field id="6" type="string" use="required" name="Frais port"/> </group> WITH fields AS (SELECT unnest(xpath('//field', schema_definition)) AS f FROM channel.structure WHERE id = 915) SELECT unnest(xpath('@id', f)) AS id, unnest(xpath('@name', f)) AS name, unnest(xpath('@use', f))::text = 'required' AS required FROM fields f <field id="1" type="string" use="required" name="EAN"/> <field id="2" type="string" use="required" name="Titre Produit"/> <field id="3" type="string" use="required" name="Marque"/> <field id="4" type="string" use="required" name="Prix HT"/>
  • 24. XML ET XPATH 24 <?xml version="1.0" encoding="UTF-8"?> <group name="Product" foreach="product" main_products_node="true"> <csv_param name="delimiter" value="|" /> <csv_param name="quotechar" value="" /> <field id="1" type="string" use="required" name="EAN"/> <field id="2" type="string" use="required" name="Titre"/> <field id="3" type="string" use="required" name="Marque"/> <field id="4" type="string" use="required" name="Prix HT"/> <field id="5" type="string" use="required" name="Prix TTC"/> <field id="6" type="string" use="required" name="Frais port"/> </group> WITH fields AS (SELECT unnest(xpath('//field', schema_definition)) AS f FROM channel.structure WHERE id = 915) SELECT unnest(xpath('@id', f)) AS id, unnest(xpath('@name', f)) AS name, unnest(xpath('@use', f))::text = 'required' AS required FROM fields id name required 1 EAN t 2 Titre Produit t 3 Marque t 4 Prix HT t
  • 25. SYSTEM VERSION 25  Standard SQL 2011  Extension Temporal Tables  Procédure versioning()  Colonne type tstzrange  Synergie avec l'héritage de table
  • 26. 26 Utilisation de triggers pour indexer les champs essentiels dans du contenu JSON TRIGGERS D’INDEXATION
  • 27. TRIGGERS D’INDEXATION 27 Cas traditionnel : données structurées SKU name price stock color 99_B33W Blue Shoes 64.99 6 blue 54_A23B Umbrella 19.99 55 black 11_R22F AiePhone 45.55 1200 white 98_N26T Chair 63.00 8 null
  • 28. TRIGGERS D’INDEXATION 28 Stockage JSON : données fusionnées dans une seule colonne id attributes 101 {‘SKU’: ’99_B33W’, ‘name’: ‘Blue Shoes’, ’price’: 64.99 …} 106 {‘SKU’: ’54_A23B’, ‘name’: ‘Umbrella’, ’price’: 19.99 …} 115 {‘SKU’: ’11_R22F’, ‘name’: ‘AiePhone’, ’price’: 45.55 …} 132 {‘SKU’: ’98_N26T’, ‘name’: ‘Chair’, ’price’: 63 …} SKU name price stock color 99_B33W Blue Shoes 64.99 6 blue 54_A23B Umbrella 19.99 55 black 11_R22F AiePhone 45.55 1200 white 98_N26T Chair 63.00 8 null
  • 29. TRIGGERS D’INDEXATION 29 catalog_198 id_catalog mapping 198 {‘id’: ‘SKU’, ‘prix’: ‘price’, ‘titre’: ‘name’, … } catalog_format CREATE TRIGGER xxx after INSERT OR UPDATE OF mapping ON catalog_format id attributes 101 {‘SKU’: ’99_B33W’, ‘name’: ‘Blue Shoes’, ’price’: 64.99 …} 106 {‘SKU’: ’54_A23B’, ‘name’: ‘Umbrella’, ’price’: 19.99 …} 115 {‘SKU’: ’11_R22F’, ‘name’: ‘AiePhone’, ’price’: 45.55 …} 132 {‘SKU’: ’98_N26T’, ‘name’: ‘Chair’, ’price’: 63 …} create index on catalog_198 using btree(attributes->>’SKU’)
  • 30. TRIGGERS D’INDEXATION 30 create index on catalog_198 using GIN (attributes) Va indexer toutes les propriétés d’un produit, trop volumineux et coûteux SELECT attributes FROM catalog_198 WHERE attributes @> ’{"SKU”: "54_A23B”}’ catalog_198 id attributes 101 {‘SKU’: ’99_B33W’, ‘name’: ‘Blue Shoes’, ’price’: 64.99 …} 106 {‘SKU’: ’54_A23B’, ‘name’: ‘Umbrella’, ’price’: 19.99 …} 115 {‘SKU’: ’11_R22F’, ‘name’: ‘AiePhone’, ’price’: 45.55 …} 132 {‘SKU’: ’98_N26T’, ‘name’: ‘Chair’, ’price’: 63 …}
  • 32. PROJETS FUTURS ▸Création d'index asynchrone avec PGQ ▹Ne pas bloquer lors du changement de mapping d’un catalogue ▸Parallélisation des requêtes sur nos 4 serveurs (Citus DB ?) ▹Chaque serveur peut scanner ¼ de la table ▸TABLESAMPLE + cache ▹Estimer très rapidement un résultat sur un échantillon, puis lancer le calcul complet qui sera mis en cache 32
  • 33. MERCI MERCI Des questions ? Contact :  mickael.le.baillif@gmail.com  guillaume.stoffer@gmail.com