La requête par laquelle MenuBuilder récupère les commentaires est sous-optimale :
- elle contient deux jointures inutiles ;
- elle prend les champs de la table et de ses colonnes, ce qui représente une augmentation significative du volume de données transféré... tout ça pour ensuite ne conserver que la première ligne du résultat en partant du principe qu'il s'agira du commentaire de la table (ce qui n'est d'ailleurs pas nécessairement vrai).
Ceci a toutefois un impact restreint sur la performance : avec la base de la DDT 16 (vue qgis_menu_builder_metadata contenant plus de 3000 lignes), corriger ces deux problèmes ne fait gagner que quelques dizaines de secondes.
Avec correctif, Michel Auzanneau indique :
- temps de chargement de QGIS en VPN sans ASGARD de 2:21 mn ;
- temps de chargement de QGIS en VPN AVEC ASGARD de 28:20 mn.
Ce qui fait une différence avec le VPN semble plutôt être le nombre de requêtes envoyées au serveur, en l'occurrence une pour chaque table.
En modifiant le plugin pour qu'il récupère en une seule fois tous les commentaires, l'intervalle entre l'authentification et la fin du chargement de QGIS tombe à 20sec (test LL sur le serveur de la DDT 16 en VPN).
Correctifs réalisés :
- ajout d'un champ table_comment à la vue qgis_menubuilder_metadata pour optimiser la récupération du commentaire ;
- modification lourde du plugin pour supprimer les opérations de récupération table par table des commentaires.
La fonction get_table_comment
est supprimée, de même que les deux appels à cette fonction (comment = self.get_table_comment(uri_struct.uri)
).
Les deux commandes par lesquels le plugin récupère le contenu de qgis_menubuilder_metadata sont modifiées :
avant :
select = """
select name, profile, model_index, datasource_uri
from {}.{}
where profile = '{}'
""".format(schema, self.table, profile)
après :
select = """
select name, profile, model_index, table_comment, datasource_uri
from {}.{}
where profile = '{}'
""".format(schema, self.table, profile)
Enfin, for name, profile, model_index, datasource_uri in self.sortby_modelindex(rows):
devient for name, profile, model_index, comment, datasource_uri in self.sortby_modelindex(rows):
.