Skip to content

Optimise la requête SQL de tables_metadata

Ronan Amicel requested to merge optimize-tables-metadata-query into main

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 le dataset_id et non sur table_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 type JSON et non JSONB donc les opérateurs nécessitent de parser à chaque fois le texte à la volée.

Contenu

  • Utilise la vue current_import dans imported_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 colonne table_name que l’on peut utiliser à la place.

    Pour les autres attributs, on fait le parsing et l’extraction côté applicatif.

Edited by Ronan Amicel

Merge request reports