Optimise la requête SQL de tables_metadata
Contexte
On a mesuré (!510 (merged)) que la requête SQL pour les métadonnées des tables prenait 10 à 15 secondes en prod (parfois même 30s).
Le problème ne s’observe qu’en prod, et pas en local, car les tables d’import sont plus grosses, et que la requête SQL passe mal à l’échelle.
Une première idée pour l’optimiser était d’ajouter des index, mais l’effet n’était pas sensible.
Il m’est ensuite apparu que :
- la requête renvoyait trop de lignes, car le
DICTINCT ON
se faisait sur ledataset_id
et non surtable_name
- on a une vue
current_import
qui fait déjà ce travail et on gagnerait à s’appuyer dessus - ce sont les accès aux attributs JSON qui sont coûteux : la colonne
spec
est de typeJSON
et nonJSONB
donc les opérateurs nécessitent de parser à chaque fois le texte à la volée.
Contenu
-
Utilise la vue
current_import
dansimported_tables_metadata()
Cela simplifie la logique, et permet de ne renvoyer qu’une seule ligne par jeu de données. Précédemment le
DISTINCT ON dataset_id
faisait qu‘on renvoyait une ligne par version d’un même jeu de données. -
Évite les opérateurs JSON dans la requête SQL
imported_tables_metadata
Pour l’attribut
table
, on a déjà une colonnetable_name
que l’on peut utiliser à la place.Pour les autres attributs, on fait le parsing et l’extraction côté applicatif.