Projet

Général

Profil

Development #6877

sql: regarder aussi aux "migrations" pour les tables et vues des formdefs

Ajouté par Frédéric Péters il y a environ 9 ans. Mis à jour il y a plus de 8 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
01 avril 2015
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Du côté des formdefs les mises à jour sont appliquées à la volée, mais seulement au premier accès, maintenant qu'on exécute du code spécifique sql au démarrage, on pourrait passer sur tous les formdefs. Ça aidera aussi en cas de modification sur la structure générale des vues, et c'est mieux qu'avoir celle-ci qui change spontanément en cours d'utilisation.


Fichiers

Révisions associées

Révision 202e2d13 (diff)
Ajouté par Frédéric Péters il y a environ 9 ans

sql: rebuild all views on startup (#6877)

Révision 929c40d7 (diff)
Ajouté par Frédéric Péters il y a environ 9 ans

sql: migrate views on startup (#6877)

This introduces a "SQL level" to sql.py, that should be bumped whenever
incompatible SQL changes have to be run at startup, it relies on a new
key/value table (wcs_meta) to hold the database current sql level.

Historique

#1

Mis à jour par Frédéric Péters il y a environ 9 ans

#2

Mis à jour par Frédéric Péters il y a environ 9 ans

C'est peut-être inutilement coûteux en temps sur des sites avec des quantités de formulaires/vues; à mesurer.

#3

Mis à jour par Frédéric Péters il y a environ 9 ans

Genre presque 10 secondes sur mon site de test qui déborde un peu (une grosse centaine de formulaires).

#4

Mis à jour par Thomas Noël il y a environ 9 ans

Ça ira sans doute plus vite une machine qui ne sait que cela, et dimensionnée pour.

Je propose de pousser ce patch.

#5

Mis à jour par Thomas Noël il y a environ 9 ans

Patch lancé sur auquo.dev : 30 secondes pour démarrer (le postgresql est en mode debug, mais quand même).

Ça ne va pas. Mais en même temps : #7017...

#6

Mis à jour par Frédéric Péters il y a environ 9 ans

Patch un peu plus long et moins testé (il faudrait que je crée l'infra nécessaire à ce genre de tests), mais en local, j'ai les chiffres suivant (pour le initialize_sql()) : sans rien 1,2 secondes, avec le premier patch ici 9,5 secondes, avec celui-ci 2,3 secondes). À mesurer sur auquo.dev

#7

Mis à jour par Frédéric Péters il y a environ 9 ans

La piste si ça reste trop long c'est d'avoir également du code de "migration" pour les vues des formdefs.

#8

Mis à jour par Thomas Noël il y a environ 9 ans

Sur dev:

$ cat /tmp/wcs-sql-time
https://alfortville.dev.au-quotidien.com (91 formdefs): 1.95542883873s ; 0.021488228997s/formdef
https://imio.dev.au-quotidien.com (11 formdefs): 0.270038127899s ; 0.0245489207181s/formdef
https://vincennes.dev.au-quotidien.com (124 formdefs): 2.36293315887s ; 0.0190559125716s/formdef
https://fsb.dev.au-quotidien.com (5 formdefs): 0.10484790802s ; 0.020969581604s/formdef

On va dire 2 centièmes de secondes par formulaire.

À voir en optimisant un peu postgresql.

#9

Mis à jour par Frédéric Péters il y a environ 9 ans

Et c'est acceptable d'avoir ces 5 secondes au démarrage ?

#10

Mis à jour par Frédéric Péters il y a environ 9 ans

Sur la prod, il y a 815 formulaires, ça ferait 16 secondes, ce sera sans doute encore utile d'améliorer les choses.

#11

Mis à jour par Thomas Noël il y a environ 9 ans

Joué sur quelques paramètres (zéro log, utilisation max de RAM, etc) : ça ne change pas, la création de vues consomme du temps, on reste à 20ms par formulaire.

#12

Mis à jour par Benjamin Dauvergne il y a environ 9 ans

C'est nécessaire d'avoir ces vues pour le fonctionnement de w.c.s. ? Dans le cas contraire on pourrait faire ça dans un autre process.

#13

Mis à jour par Benjamin Dauvergne il y a environ 9 ans

Un truc qui m'étonne c'est que normalement les vues c'est gratuit: il n'y normalement aucun stockage, ni table, ni index, c'est juste des sortes de macro. Je ne vois pas d'où viennent tous ces délais, peut-être la requête est-elle exécutée une première fois pour voir qu'elle fonctionne.

#14

Mis à jour par Benjamin Dauvergne il y a environ 9 ans

20ms par formulaire ça me fait penser au temps nécessaire pour faire un commit sur disque, peut-être essayer d'accomplir tout cela dans une seule transaction (là j'ai l'impression qu'il y en a une par formdef).

#15

Mis à jour par Frédéric Péters il y a environ 9 ans

Après réflexion sur le sujet, je reste attaché à l'idée d'exécuter ça au démarrage, qu'on évite des structures de tables/vues qui changent spontanément lors de l'accès à une donnée ou page particulière. Mais mon plan maintenant serait plus simple, plutôt qu'avoir un initialize_sql() servant à la fois à la mise en place initiale des structures et à leurs migrations, je créerais un migrate_sql() et stockerait un "niveau" de SQL, qu'on aurait à manuellement incrémenter en cas de modification incompatible. Si que le niveau connu de sql.py correspond au niveau enregistré dans la base, on ne fait rien; sinon, on peut faire un truc un peu coûteux, sachant que ça n'aura pas lieu à tous les démarrages.

#16

Mis à jour par Frédéric Péters il y a environ 9 ans

Voilà, avec des tests pour me rassurer.

#17

Mis à jour par Thomas Noël il y a environ 9 ans

Ack.

Par la suite, on pourrait ajouter une commande "sqlmigrate" à wcsctl (typiquement pour aider à faire un init.d qui détaille le démarrage, qu'on ne soit pas surpris quand ça prendra 15 secondes un jour sur un reboot en prod).

#18

Mis à jour par Frédéric Péters il y a environ 9 ans

  • Statut changé de En cours à Résolu (à déployer)

Par la suite [...]

Par la (très) suite on aura une application django et on pourra utiliser le mécanisme de migration pour construire les tables...

commit 929c40d7d528b0ea80a188c49d34343ba7e0b031
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Wed Apr 1 15:06:34 2015 +0200

    sql: migrate views on startup (#6877)

    This introduces a "SQL level" to sql.py, that should be bumped whenever
    incompatible SQL changes have to be run at startup, it relies on a new
    key/value table (wcs_meta) to hold the database current sql level.
#19

Mis à jour par Thomas Noël il y a plus de 8 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF