Vérifier que SQLAlchemy ne fait pas n'importe quoi #107
Closed
opened 12 months ago by Lephenixnoir
·
3 comments
Loading…
Reference in new issue
There is no content yet.
Delete Branch '%!s(<nil>)'
Deleting a branch is permanent. It CANNOT be undone. Continue?
Rien de très violent, mais quelques problèmes récents (genre #105 et l'histoire du nombre de topics des membres) montrent qu'on ne sait pas vraiment ce que SQLAlchemy fait de nos modèles. Faudrait qu'on puisse contrôler que c'est pas n'importe quoi.
Plan :
Il faudrait trouver un équivalent de la Django Debug Toolbar pour flask-sqlalchemy, ça permettrait de timer les requètes SQL, et tout ça.
Cheatsheet pour la vérification dans PostgreSQL.
Afficher les détails de chaque table (
\d+ <table>
). Vérifier que les champs, les index ainsi que les contraintes répondent au modèle mental qu'on a de la bdd.Liste des tables testées avec les infos non triviales :
attachment
(pas d'index surcomment_id
)comment
(index surthread_id
)forum
group
(index surname
pour l'unicité)group_member
(pas de clé primaire)group_privilege
guest
member
(index suremail
,name
etnorm
pour l'unicité)notification
(pas d'index surowner_id
)poll
(choices
est encodé en bytearray moche)pollanswer
(pas d'index surpoll_id
,choice
est encodé en bytearray moche)post
(pas d'index surauthor_id
, ni surdate_created
/date_modified
)program
special_privilege
(index surmid
)thread
(owner_post
non matérialisé)title
topic
(pas d'index surforum_id
)trophy
(index surname
etdescription
- ?)trophy_member
(pas de clé primaire, pas d'index suruid
)user
Bonne nouvelle donc, la base PostgreSQL est pas mal. La seule vériable inconnue donc c'est la façon dont SQLAlchemy génère ses
JOIN
pour les requêtes, ce qu'on peut toujours ajuster à la main dans le code.En attendant, pour les problèmes que j'ai notés en gras :
attachment.comment_id
: nécessaire pour lister les pièces jointes d'un message donné.notification.owner_id
: nécessaire pour lister les notifications d'un membre connecté.pollanswer.poll_id
: nécessaire pour calculer les résultats.post.author_id
: probablement nécessaire pour lister les topics, programmes, etc. d'un membre connecté.post.date_created
/post.date_modified
: nécessaire pour lister les topics récents.thread.owner_post
**pas matérialisé : il doit donc être obtenu par une requête. On s'en sert pas souvent dans le code mais ultimement pour chaque message affiché sur une page de forum on teste si l'utilisateur peut le modifier/supprimer, ce qui va chercher son topic parent, ce qui passe par là.topic.forum_id
: nécessaire pour afficher les pages de chaque forum.trophy.uid
: nécessaire pour lister les trophées d'un membre donné.Puisque j'ai ajouté tous les index, et qu'avec la Flask Debug Toolbar on a bien optimisé le temps de génération (qui est dominé par la BDD) en réduisant notamment le risque du « problème des N+1 requêtes » via des
lazy="join"
bien placés, je ferme cette issue. On pourra refaire du tuning plus tard.