Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BACKEND][API] Performance route /biblistes avec des listes contenant beaucoup de taxons #584

Closed
andriacap opened this issue Nov 21, 2024 · 1 comment

Comments

@andriacap
Copy link
Contributor

Bonjour,

En testant l'ajout d'une liste avec tout taxref (+600k lignes) l'appel à la route biblistes assez longue (20 à 25secondes).
En regardant le temps écoulé pour chaque ligne éxécutée , celle qui prend le plus de temps dans cette route est sérialisation des données (la quasi totalité du temps de la requête) ici :

maliste["data"] = biblistes_schema.dump(data, many=True)

Cela est du au fait qu'il tente sérialiser le champ "noms" qui fait référence à une jointure avec taxref et donc contient beaucoup d'élements (dans le cas de tout taxref c'est +600k).

Cette route n'a pas pour but de récupérer les éléments de taxref du coup j'ai tenté de modifier la route en remplaçant

Ca :

data = db.session.query(BibListes).all()

Par ça :

    data = db.session.query(
    BibListes.id_liste,
    BibListes.code_liste,
    BibListes.nom_liste,
    BibListes.nb_taxons  # ici correspond à l'expression SQL du modèle Biblistes
    ).all()

En faisant ça j'ai eu des erreurs sur l'expression nb_taxons du modèle BibListes ici :

https://github.com/PnX-SI/TaxHub/blob/ea9434de5a1f227131e0e8640ad17f8a25e8a39d/apptax/taxonomie/models.py#L266C3-L272C10

Etant donné que cor_nom_liste n'est pas de type db.Model mais de type db.Table il faut appeler les colonnes via l'attribut "c" . De plus le where est censé être fait entre cor_nom_liste et Biblistes (cls dans ce cas) .
Ce qui amène à la modification suivante de l'expression nb_taxons

    @nb_taxons.expression
    def nb_taxons(cls):
        return (
            db.select([db.func.count(cor_nom_liste.c.id_liste)])
            .where(cor_nom_liste.c.id_liste == cls.id_liste)
            .label("nb_taxons")
        )

En appliquant ces deux modifications et en relançant la requête je tombe à 0.06 seconde

@camillemonchicourt
Copy link
Member

Fait dans la 2.1.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants