Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour,
J'aurais une question concernant la performance d'une de mes applications. C'est une application qui recense un certain nombre de KPI. Toutes les formules des KPI sont dans un fichier Excel que j'importe au chargement de l'application. Le gros souci, c'est qu'à chaque changement de filtre (de personne, de période, de département, de société...) tous les calculs sont refaits, et l'application freeze pendant quelques secondes puis les calculs se mettent à jour.
Avec cette façon de faire, j'ai une vue directe et pratique sur toutes mes formules en même temps, et elle m'a permis de gagner beaucoup de temps dans mon développement. Mais clairement après utilisation, ce n'est pas le top niveau performance...
Est-ce que quelqu'un aurait une idée de la façon d'optimiser tout cela en gardant le principe du "Tout est recensé au même endroit"?
Merci
Bonjour,
Le fait de créer toutes les expressions dans un fichier et de générer des variables est une bonne pratique de développement mais n'impacte pas les performance de ton application.
Que les calculs soient créés dans l'app ou via le script ne change pas le fonctionnement de Qlik, qui est que les calculs sont réalisés à la volée dans l'interface à chaque changement du scope des données (sélection qui réduit ou étend les valeurs associées).
Le sujet de la performance est vaste et diffère selon les applications.
Si tu as beaucoup de calculs différents réalisés dans la même page, et que tu ne peux pas réduire ce nombre, il faut dans un premier temps :
Regarder ton modèle de données pour l'optimiser (modélisation,nombre de tables, clés)
Analyses les set analysis, repérés les plus complexes et coûteux en temps de calculs
Peux tu partager une image de ton modèle de données et quelques exemples d'expressions ?
Voici un lien vers une synthèse sur le sujet de la performance :
Tu trouveras pas mal de ressources sur ce sujet dans les blogs ou ici.
Bonjour,
Merci pour ton retour.
Mon modèle est en effet, plutôt complexe, car l'application concerne beaucoup de services de l'entreprise, je dois centraliser toutes les données dans cette application (en pièce jointe). J'ai créée mois même une table de clés synthétiques "SK" pour que tout soit en lien, et tout fonctionne comme attendu. Il reste encore un service a intégrer, ce qui va potentiellement encore alourdir le tout...
Quelques exemples d'expressions :
une première :
count(distinct {<DB_SC_Type = {1}, DB_SAV_Ended = {1}, ResponseIsInSLA = {1}, DB_ResponseTime = {"<=$(v_Filtre_TRM_Inc)"}, DB_ResolutionTime = {"<=$(v_Filtre_TCM_Inc)"}>} Doc_No)
/
count(distinct {<DB_SC_Type = {1}, DB_SAV_Ended = {1}, ResponseIsInSLA = {0,1}, DB_ResponseTime = {"<=$(v_Filtre_TRM_Inc)"}, DB_ResolutionTime = {"<=$(v_Filtre_TCM_Inc)"}>} Doc_No )
une 2ème :
if(vDateFin_SelectedPériodeKPIService > vToday,
//si la date de fin de période est > à aujourdhui
sum({<DB_C_Code = {'L07'}, TT_StartingDate= {">=$(vDateDébut_SelectedPériodeKPIService)<=vToday"}>}DB_QtyTS) ,
//si la date de fin de période est < à aujourdhui
sum({<DB_C_Code = {'L07'}>}DB_QtyTS)
)
/
(
if(vDateFin_SelectedPériodeKPIService > vToday,
NetWorkDays(vDateDébut_SelectedPériodeKPIService, vToday ,$(vJourFériéConcat)) * count(distinct TT_ResNo),
NetWorkDays(vDateDébut_SelectedPériodeKPIService, vDateFin_SelectedPériodeKPIService,$(vJourFériéConcat)) * count(distinct TT_ResNo))
)
j'en ai quelques une comme la prochaine, pour lesquelles j'avais mis dans des variables chaque "décomposition" de la formule. Mais ça me posait des soucis de lecture, je devais ouvrir l'application pour voir a quoi correspondait les variables utilisées et ça me prenait un temps fou aussi, je suis revenu à cette pratique :
(dans l'exemple ci dessous, " heures prestées sur les tickets " ,"heures livraison", "heures connexion " ... étaient précédemment dans des variables définies dans l'application)
// Working time / available hours
// WORKING TIME
(
(
// heures prestées sur les tickets
if($(vDateFin_SelectedPériodeKPIService) > vToday,
sum({<DB_SC_Type = {1,2}, TT_StartingDate= {">=$(vDateDébut_SelectedPériodeKPIService)<=vToday"}>}TT_HoursQty),
sum({<DB_SC_Type = {1,2}>}TT_HoursQty)
)
+
//heures livraison
if($(vDateFin_SelectedPériodeKPIService) > vToday,
//si la date de fin de période est > à aujourdhui
sum({<DB_C_Code = {'L01'}, TT_StartingDate= {">=$(vDateDébut_SelectedPériodeKPIService)<=vToday"}>}TT_HoursQty) ,
//si la date de fin de période est < à aujourdhui
sum({<DB_C_Code = {'L01'}>}TT_HoursQty)
)
+
//heures connexion
if($(vDateFin_SelectedPériodeKPIService) > vToday,
//si la date de fin de période est > à aujourdhui
sum({<DB_C_Code = {'L06'}, TT_StartingDate= {">=$(vDateDébut_SelectedPériodeKPIService)<vToday"}>}TT_HoursQty) ,
//si la date de fin de période est < à aujourdhui
sum({<DB_C_Code = {'L06'}>}TT_HoursQty)
)
+
//heures installation
if($(vDateFin_SelectedPériodeKPIService) > vToday,
//si la date de fin de période est > à aujourdhui
sum({<DB_C_Code = {'L07'}, TT_StartingDate= {">=$(vDateDébut_SelectedPériodeKPIService)<=vToday"}>}TT_HoursQty) ,
//si la date de fin de période est < à aujourdhui
sum({<DB_C_Code = {'L07'}>}TT_HoursQty)
)
+
if($(vDateFin_SelectedPériodeKPIService) > vToday,
//si la date de fin de période est > à aujourdhui
sum({<TD_TT_StartingDate= {">=$(vDateDébut_SelectedPériodeKPIService)<=vToday"},TD_TaskID ={16585,16904,12,13,33237,28947}>}TD_TT_HoursQty),
//si la date de fin de période est < à aujourdhui
sum({<TD_TT_StartingDate= {">=$(vDateDébut_SelectedPériodeKPIService)<=$(vDateFin_SelectedPériodeKPIService)"},TD_TaskID ={16585,16904,12,13,33237,28947}>}TD_TT_HoursQty)
)
)
)
/
// AVAILABLE HOURS
(
if(vDateFin_SelectedPériodeKPIService > vToday,
(NetWorkDays(vDateDébut_SelectedPériodeKPIService, vToday ,$(vJourFériéConcat)) * 8* count(distinct TT_ResNo)) - (sum({<TD_TT_StartingDate= {">=$(vDateDébut_SelectedPériodeKPIService)<=vToday"},TD_TaskID ={3}>}TD_TT_HoursQty) + sum({<TD_TT_StartingDate= {">=$(vDateDébut_SelectedPériodeKPIService)<=vToday"},TD_TaskID ={4} >}TD_TT_HoursQty)),
(NetWorkDays(vDateDébut_SelectedPériodeKPIService, vDateFin_SelectedPériodeKPIService,$(vJourFériéConcat)) * 8* count(distinct TT_ResNo)) - (sum({<TD_TT_StartingDate= {">=$(vDateDébut_SelectedPériodeKPIService)<=$(vDateFin_SelectedPériodeKPIService)"},TD_TaskID ={3} >}TD_TT_HoursQty) + sum({<TD_TT_StartingDate= {">=$(vDateDébut_SelectedPériodeKPIService)<=$(vDateFin_SelectedPériodeKPIService)"},TD_TaskID ={4}>}TD_TT_HoursQty))
)
)
Merci pour la documentation.
Bonjour Jenny,
Tout d'abord ton modèle possède une table en étoile ce qui crée des doublons et donc tu dois la supprimer en renommant les champs de la table : SYN1_TABLE
Par la suite, pour ainsi favoriser la performance :
- Je te suggère dans un premier temps de favoriser le développement de calcul dans le script et non dans l'interface cela te permettra de supprimer tous les calculs sur ta page d'interface Qlik ou du moins de les réduire pour ainsi te permettre d'explorer plus facilement tes données.
- Il existe également des combines en créant une autre application en tapant sur le script binary ce qui te permet de réaliser tout les calculs dans une application secondaire pour une application très lourde qui recharge énormément de donnée ce genre de problème est idéal avec la création de QVD (ce problème n'a pas l'aire d'être ton cas mais peut s'avérer très utile, je t'invite également à essayer).
Plus tu as de condition de calcul dans l'interface graphique côtés utilisateurs plus de latence tu auras..
Bon courage,
AB