https://dev.entrouvert.org/https://dev.entrouvert.org/favicon.ico?15861920342022-08-22T12:49:39ZRedmine Entr’ouvertw.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4014932022-08-22T12:49:39ZPierre Ducroquet
<ul></ul><p>Exemples de code repéré pouvant correspondre à cette requête:</p>
<pre>
# wcs/admin/forms.py
# remove existing shared views
for view in get_publisher().custom_view_class.select():
if view.match(user=None, formdef=self.formdef):
view.remove_self()
# wcs/backoffice/management.py
def get_custom_views(self, criterias=None):
for view in get_publisher().custom_view_class.select(clause=criterias):
if view.match(get_request().user, self.formdef):
yield view
def get_formdata_sidebar(self, qs=''):
r = TemplateIO(html=True)
r += htmltext('<ul id="sidebar-actions">')
r += self.get_formdata_sidebar_actions(qs=qs)
r += htmltext('</ul>')
views = list(self.get_custom_views())
# ...
def save_view(self):
# ...
for view in self.get_custom_views():
if view.id == custom_view.id:
continue
if custom_view.visibility == view.visibility and view.is_default:
view.is_default = False
view.store()
# ....
def _q_lookup(self, component):
if component == 'ics':
return self.ics()
if not self.view:
for view in self.get_custom_views():
if view.get_url_slug() == component:
return self.__class__(formdef=self.formdef, view=view)
</pre>
<p>Je vais tenter d'identifier si il y a des requêtes web qui sont plus fréquentes que les autres.</p> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4015132022-08-22T13:56:38ZPierre Ducroquet
<ul><li><strong>Fichier</strong> <a href="/attachments/68756">0001-CustomView-reduce-number-of-select-with-no-criteria-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/68756/0001-CustomView-reduce-number-of-select-with-no-criteria-.patch">0001-CustomView-reduce-number-of-select-with-no-criteria-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/68757">0002-CustomView-index-the-formdef_id-column-we-are-going-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/68757/0002-CustomView-index-the-formdef_id-column-we-are-going-.patch">0002-CustomView-index-the-formdef_id-column-we-are-going-.patch</a> ajouté</li><li><strong>Statut</strong> changé de <i>Nouveau</i> à <i>Solution proposée</i></li><li><strong>Patch proposed</strong> changé de <i>Non</i> à <i>Oui</i></li></ul><p>Ce patch corrige le chemin le plus violent que j'ai repéré.</p> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4015152022-08-22T14:02:16ZA. Berriot
<ul></ul><p>C'est possiblement un détail mais je vois une condition <code> if self.formdef_type != formdef.xml_root_node:</code> dans la fonction <code>def match(</code> que tu as remplacée par ton <code>.select</code>. Est-ce que ça ne risque pas de poser problème ?</p> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4015212022-08-22T14:16:53ZPierre Ducroquet
<ul><li><strong>Fichier</strong> <a href="/attachments/68761">0001-CustomView-reduce-number-of-select-with-no-criteria-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/68761/0001-CustomView-reduce-number-of-select-with-no-criteria-.patch">0001-CustomView-reduce-number-of-select-with-no-criteria-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/68762">0002-CustomView-index-the-formdef_id-column-we-are-going-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/68762/0002-CustomView-index-the-formdef_id-column-we-are-going-.patch">0002-CustomView-index-the-formdef_id-column-we-are-going-.patch</a> ajouté</li></ul><p>Mea culpa.</p> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4015242022-08-22T14:23:20ZA. Berriot
<ul><li><strong>Statut</strong> changé de <i>Solution proposée</i> à <i>Solution validée</i></li></ul> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4015562022-08-22T15:08:49ZPierre Ducroquet
<ul><li><strong>Fichier</strong> <a href="/attachments/68771">0001-CustomView-reduce-number-of-select-with-no-criteria-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/68771/0001-CustomView-reduce-number-of-select-with-no-criteria-.patch">0001-CustomView-reduce-number-of-select-with-no-criteria-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/68770">0002-CustomView-index-the-formdef_id-column-we-are-going-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/68770/0002-CustomView-index-the-formdef_id-column-we-are-going-.patch">0002-CustomView-index-the-formdef_id-column-we-are-going-.patch</a> ajouté</li><li><strong>Statut</strong> changé de <i>Solution validée</i> à <i>Solution proposée</i></li></ul><p>Version validée par Jenkins, 2/3 conneries de ma part.</p> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4015642022-08-22T15:31:33ZPierre Ducroquet
<ul></ul><p>Note : cette requête représente 25% du temps d'exécution PostgreSQL total cet après-midi sur la prod de toulouse. Donc il y a un vrai intérêt à l'identifier et à l'éliminer.</p> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4015822022-08-22T22:14:23ZPierre Ducroquet
<ul><li><strong>Fichier</strong> <a href="/attachments/68773">0001-CustomView-reduce-number-of-select-with-no-criteria-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/68773/0001-CustomView-reduce-number-of-select-with-no-criteria-.patch">0001-CustomView-reduce-number-of-select-with-no-criteria-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/68774">0002-CustomView-index-the-formdef_id-column-we-are-going-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/68774/0002-CustomView-index-the-formdef_id-column-we-are-going-.patch">0002-CustomView-index-the-formdef_id-column-we-are-going-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/68775">0003-CustomView-remove-other-calls-to-criteria-less-selec.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/68775/0003-CustomView-remove-other-calls-to-criteria-less-selec.patch">0003-CustomView-remove-other-calls-to-criteria-less-selec.patch</a> ajouté</li></ul><p>Suite à une discussion avec Fred, je suis allé chercher plus loin.<br />J'ai optimisé tous les appels aveugles à custom_views que j'ai trouvé. Je ne vois pas de raison pour qu'en optimisant tous les appels on ne tombe pas sur le bon. Celui sur le slug m'intrigue le plus, ça a l'air d'être un chemin pas mal utilisé.</p> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4015882022-08-23T05:10:14ZFrédéric Pétersfpeters@entrouvert.com
<ul></ul><p>Je ne suis pas totalement à l'aise avec ça à deux jours de la mise en prod, ça demande un effort de relecture difficile.</p>
<p>En fait 1/ je ne prendrais pas 0001, qui concerne du code d'import/export, pas sensible, risque inutile.</p>
<p>0002 oui d'accord</p>
<p>0003 en fait ce que je voulais dire dans la discussion c'était qu'on pouvait sans risque déplacer le filtre sur les colonnes formdef_type/formdef_id vers l'SQL, mais garder l'appel à la méthode match() pour vérifier l'appartenance.</p>
<p>0003 en lisant j'ai l'impression qu'il fait l'inverse, et perd en chemin la vérification formdef_type/formdef_id.</p>
<p>Par ailleurs je regarde maintenant dans la db et je compte pour une seule démarche 579 vues personnalisées, donc je me dis que j'étais trop naïf à espérer nous en sortir avec juste formdef_type/formdef_id, que le reste est à prendre aussi.</p>
<p>Mais que peut-être ça ne sera pas assez et qu'en fait il y a quelque part de base un problème chez un utilisateur, qui à lui seul a 512 de ces 579 vues, toutes avec le même nom, et les slugs tous-les-dossiers, tous-les-dossiers-2, tous-les-dossiers-3... tous-les-dossiers-512.</p>
<p>Cet utilisateur aura encore des problèmes, il y a sans doute quelque chose dans l'UI qui pose problème.</p>
<p>Dans l'immédiat donc, j'éliminerais 0001 de la branche, 0002 ok (mais retirer la majuscule au préfixe du message de commit), 0003 ajouter le Equal('formdef_type', ...), Equal('formdef_id', ...) qui me semble manquer (dans le get_custom_views(); je voyais vaguement quelque chose comme ça, pas testé :</p>
<pre>
def get_custom_views(self, criterias=None):
for view in get_publisher().custom_view_class.select(
clause=[
Equal('formdef_type', self.formdef_class.xml_root_node),
Equal('formdef_id', str(self.formdef_class.id)),
]
+ (criterias or [])
):
if view.match(get_request().user, self.formdef):
yield view
</pre> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4018912022-08-24T19:36:40ZFrédéric Pétersfpeters@entrouvert.com
<ul><li><strong>Fichier</strong> <a href="/attachments/68842">0002-custom-views-remove-frequent-calls-to-criteria-less-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/68842/0002-custom-views-remove-frequent-calls-to-criteria-less-.patch">0002-custom-views-remove-frequent-calls-to-criteria-less-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/68843">0001-custom-views-index-the-formdef_id-column-we-are-goin.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/68843/0001-custom-views-index-the-formdef_id-column-we-are-goin.patch">0001-custom-views-index-the-formdef_id-column-we-are-goin.patch</a> ajouté</li></ul><p>Pas à l'aise avec le get_by_url_slug introduit dans 0003, il ne discrimine pas sur l'id de l'agent connecté, ce que faisait l'enchainement actuel (boucle sur le résultat de get_custom_views() qui vérifie ça); j'ai modifié pour plutôt faire</p>
<pre>
- for view in self.get_custom_views():
- if view.get_url_slug() == component:
- return self.__class__(formdef=self.formdef, view=view)
+ view_slug = component
+ if view_slug.startswith('user-'):
+ view_slug = view_slug[5:]
+ for view in self.get_custom_views([Or([Equal('slug', view_slug), Equal('slug', component)])]):
+ return self.__class__(formdef=self.formdef, view=view)
</pre>
<p>i.e. on filtre sur slug = le slug attendu (et/ou sans le préfixe user-, si jamais on se trouvait avec des vues commençant vraiment par user-).</p>
<p>J'ai mis ça dans une branche wip/68324-custom_view-2 (qui retire aussi le 0001 et adapte les messages de commit).</p> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4018982022-08-25T06:23:28ZFrédéric Pétersfpeters@entrouvert.com
<ul></ul><p>C'est plus que limite côté calendrier mais c'est une optimisation qui aurait été bienvenue pour la mise en production de ce soir.</p> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4019092022-08-25T07:29:21ZPierre Ducroquet
<ul><li><strong>Statut</strong> changé de <i>Solution proposée</i> à <i>Solution validée</i></li></ul><p>Frédéric Péters a écrit :</p>
<blockquote>
<p>Pas à l'aise avec le get_by_url_slug introduit dans 0003, il ne discrimine pas sur l'id de l'agent connecté, ce que faisait l'enchainement actuel (boucle sur le résultat de get_custom_views() qui vérifie ça); j'ai modifié pour plutôt faire</p>
<p>[...]</p>
<p>i.e. on filtre sur slug = le slug attendu (et/ou sans le préfixe user-, si jamais on se trouvait avec des vues commençant vraiment par user-).</p>
</blockquote>
<p>Dac. La justification pour moi de cette fonction était surtout de garder côte à côte la logique du get_url_slug() et du filtrage sur le slug.</p>
<p>Et détail tout à fait mineur dans un tel cas : <br /><pre>Or([Equal('slug', view_slug), Equal('slug', component)])</pre><br />s'écrit plus avantageusement:<br /><pre>Contains('slug', [view_slug, component])</pre><br />(plus court, et sur les cas plus complexe bien plus efficace pour le PG)</p>
<p>Pour ma part, vu le gain que ça procurerait pour toulouse, je suis largement favorable à ce qu'on fasse une exception ici.</p> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4019302022-08-25T08:24:29ZFrédéric Pétersfpeters@entrouvert.com
<ul><li><strong>Statut</strong> changé de <i>Solution validée</i> à <i>Résolu (à déployer)</i></li></ul><p>modifié pour utiliser Contains,</p>
<pre>
commit 33f6acea6a6b1476fb08dea12c08daee9e005210
Author: Pierre Ducroquet <pducroquet@entrouvert.com>
Date: Mon Aug 22 18:03:28 2022 +0200
custom views: remove frequent calls to criteria-less select() (#68324)
commit 5f3deb17f702362d2e56f36850ec5477d1f0db96
Author: Pierre Ducroquet <pducroquet@entrouvert.com>
Date: Mon Aug 22 15:55:48 2022 +0200
custom views: index the formdef_id column we are going to use more (#68324)
</pre> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4019442022-08-25T09:14:28ZTransition automatique
<ul><li><strong>Statut</strong> changé de <i>Résolu (à déployer)</i> à <i>Solution déployée</i></li></ul> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4106532022-09-29T08:11:04ZLauréline Guérin
<ul><li><strong>Lié à</strong> <i><a class="issue tracker-1 status-5 priority-4 priority-default closed" href="/issues/69699">Bug #69699</a>: Vue de traitement, vues personnalisées 'user' et 'all' avec le même slug</i> ajouté</li></ul> w.c.s. - Development #68324: SQL: requête sur custom_views exécutée énormémenthttps://dev.entrouvert.org/issues/68324?journal_id=4188892022-10-30T03:42:01ZTransition automatique
<ul></ul><p>Automatic expiration</p>