Development #24239
Réduire le nombre de requêtes sur les cellules
0%
Description
Pour afficher une page on doit passer par tous les types de cellule et aujourd'hui ça fait déjà 36 tables.
Dans #17645 j'ai éliminé la piste de la transformation de CellBase en modèle concret mais dans sa description j'écrivais déjà « si au niveau d'une page on gardait un cache du type de cellules qui s'y trouvent, on réduirait drastiquement le nombre de requêtes. » et cette piste pourrait être reprise ici.
Je proposerais ici d'ajouter un related_cells = JSONField(…), et dans un premier temps de simplement y avoir un dictionnaire {'cell_types': […]}, (avec les get_cell_type_str); et simplement les signaux pre_save/pre_delete interceptés pour les cellules. (i.e. ne pas conserver une sérialisation des cellules dans l'objet Page, continuer à faire des requêtes sur les tables des cellules).
Modifier ensuite Page.get_cells et CellBase.get_cells pour se baser sur related_cells['cell_types'] plutôt que passer sur tous les modèles. (et si jamais cell_types n'existait pas, passer partout et l'écrire pour la fois suivante).
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Frédéric Péters il y a presque 6 ans
- Lié à Autre #24237: performance, analyse/amélioration requêtes SQL ajouté
Mis à jour par Frédéric Péters il y a presque 6 ans
Branche brouillon postée en wip/24237-sql-reduction.
Mis à jour par Frédéric Péters il y a presque 6 ans
- Fichier 0001-general-keep-cache-of-cell-types-used-in-a-page-2423.patch 0001-general-keep-cache-of-cell-types-used-in-a-page-2423.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Emmanuel Cazenave il y a presque 6 ans
Je trouve que l'imbrication entre Page.get_cells
et CellBase.get_cells
rend le truc un peu confus.
Page.get_cells
a la responsabilité de maintenir le cache à jour (en plus des cell_post_save et cell_post_delete, tu essaies de palier à un problème éventuel problème sur les signaux c'est ça ?), mais pour se faire Page.get_cells
se repose sur CellBase.get_cells
qui justement utilise le cache ...
Bref pas très constructif mes remarques. J'ai essayé de goupiller une adaptation plus simple pour donner du corps à mon propos mais j'arrive à rien.
Mis à jour par Emmanuel Cazenave il y a presque 6 ans
Seconde lecture, j'imagine un scénario catastrophe :
- le cache d'une page n'est pas à jour (mais pas vide) à cause d'un plantage, whatever
* le seul moyen de le mettre à jour est un appel à
Page.get_cells
*Page.get_cells
appelleCellBase.get_cells
qui lui renvoie une ensemble de cellules en se basant sur ce cache incomplet *Page.get_cells
ne mettra pas le cache à jour parce que qu'elle compare le cache avec ce que lui renvoieCellBase.get_cells
Peut-être faire en sorte que le cache ne soit utilisé que pour du rendu de page et que lorsque l'on modifie une page où une cellule, le cache soit supprimé puis recréé de zéro ?
Mis à jour par Frédéric Péters il y a presque 6 ans
Peut-être faire en sorte que le cache ne soit utilisé que pour du rendu de page et que lorsque l'on modifie une page où une cellule, le cache soit supprimé puis recréé de zéro ?
J'ai poussé une nouvelle version simplifiée ainsi, post_save/post_delete d'une cellule, le cache est entièrement recalculé.
Mis à jour par Emmanuel Cazenave il y a presque 6 ans
- Statut changé de Solution proposée à Solution validée
okay
Mis à jour par Frédéric Péters il y a presque 6 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 9e6adee4f9153bd838f20670b3195db38929f5fd Author: Frédéric Péters <fpeters@entrouvert.com> Date: Sat Jun 2 15:08:57 2018 +0200 general: keep cache of cell types used in a page (#24239)
Mis à jour par Frédéric Péters il y a plus de 5 ans
- Statut changé de Résolu (à déployer) à Solution déployée
general: keep cache of cell types used in a page (#24239)