Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour à tous,
Je rencontre des problèmes de lenteur lors de l'un de mes script incrémental.
La table actualisé : [Détail Commande]
Actuellement mon QVD [Détail Commande] contient plus de 106 millions de lignes,
Lorsque mon script vas chercher la date max du champ "LastUpdateDate" de ma table [Détail Commande] cela prend 25 min.
Ci-dessous la partie du script qui vas chercher le max du champ "LastUpdateDate"
Tmp:
Load
Max(LastUpdateDate) AS max_dt
From
[$(vFileName)] (QVD)
;
J'ai pensé à deux choses pour pour pallier à ce problème, mais j'aimerais avoir votre avis d'expert
- intégrer dans un fichier annexe la dernière ligne charger de ma base (qui devrait être la ligne avec le "LastUpdateDate" max)
- intégrer un champ dans mon QVD "MaxLastUpdateDate" qui serait écrasé avec la valeur du champs "LastUpdateDate" max chargé à chaque chargement
Je reste bien évidement à votre disposition pour toutes demandes de renseignements supplémentaires
Merci d'avance,
Bonjour Sébastien, j'ai été un peu pris ses derniers jours et je viens à peine de faire les modifications sur mon script.
Pourquoi en plaçant le rechargement du max(LastUpdateDate) après le Concatenate, il cherche dans ce qui vient d'être charger et non pas dans la table entière concaténé ?
Pour ma part j'aurais placé le rechargement du max(LastUpdateDate) avant le Concatenate, mais ça ne marche pas (oui oui j'ai essayé ), j'aimerais comprendre pourquoi mon raisonnement est mauvais.
DétailCommande:
LOAD *
INLINE [
id, Field2, LastUpdateDate
AAA, XXX, 2017-03-15 06:22:11
BBB, YYY, 2017-06-28 12:56:43
CCC, ZZZ, 2017-04-03 18:09:35
DDD, WWW, 2017-07-21 10:00:00
]
Where LastUpdateDate >= '$(vLastUpdated_DetailCommande)';
//Concatenate
//LOAD *
//from [$(vFileName)] (QVD)
//WHERE NOT Exists(id);
Concatenate
LOAD *
INLINE [
id, Field2, LastUpdateDate
AAA, XXX, 2017-03-15 06:22:11
BBB, YYY, 2017-06-28 12:56:43
CCC, ZZZ, 2017-04-03 18:09:35
]
WHERE NOT Exists(id);
Tmp:
Load max(LastUpdateDate) AS max_dt
Resident DétailCommande;
// Mise à jour de la variable max date chargé
Let vLastUpdated_DetailCommande = Date(Peek('max_dt',0, 'tmp'),'YYYY-MM-DD hh:mm:ss');
Trace($(vLastUpdated_DetailCommande));
Drop Table Tmp;
Et encore une fois merci pour l'aide
Le script Order, uniquement 3M de lignes durait 7 min, maintenant c'est inférieur à 1 min, en début d'aprem je te fais un retour sur le temps de chargement du détail des commandes
Le max(LastUpdateDate) placé après le Concatenate, va chercher dans la table entière concaténé, pas seulement dans ce qui vient d'être charger.
Il faut bien penser que l'on fait ça pour mettre à jour la variable vLastUpdated_DetailCommande qui sera utilisée lors du prochain chargement, il faut donc bien faire le max sur la totalité des données.
Il y a une première partie que tu n'a pas copié ci-dessus pour mettre à jour la variable lors du 1er chargement.
J'espère que c'est plus clair.
Je n'ai pas copié la première partie du script pour ne pas surcharger le post,
Merci pour l'explication, par contre, est il possible pour raccourcir le temps de chargement de rechercher le max(LastUpdateDate) non pas sur la table concaténé mais uniquement sur les données qui viennent d'être chargées
Le max se fait sur une table interne à QlikView, ça ne doit pas prendre beaucoup de temps.
Mais si tu veux essayé de le faire que sur les nouvelles données, tu peux le faire comme ceci :
DétailCommande:
LOAD *
INLINE [
id, Field2, LastUpdateDate
AAA, XXX, 2017-03-15 06:22:11
BBB, YYY, 2017-06-28 12:56:43
CCC, ZZZ, 2017-04-03 18:09:35
DDD, WWW, 2017-07-21 10:00:00
]
Where LastUpdateDate >= '$(vLastUpdated_DetailCommande)';
//Concatenate
//LOAD *
//from [$(vFileName)] (QVD)
//WHERE NOT Exists(id);
NoConcatenate
DétailCommande_new:
LOAD *
INLINE [
id, Field2, LastUpdateDate
AAA, XXX, 2017-03-15 06:22:11
BBB, YYY, 2017-06-28 12:56:43
CCC, ZZZ, 2017-04-03 18:09:35
]
WHERE NOT Exists(id);
Tmp:
Load max(LastUpdateDate) AS max_dt
Resident DétailCommande_new;
// Mise à jour de la variable max date chargé
Let vLastUpdated_DetailCommande = Date(Peek('max_dt',0, 'Tmp'),'YYYY-MM-DD hh:mm:ss');
Trace($(vLastUpdated_DetailCommande));
Drop Table Tmp;
Concatenate (DétailCommande)
LOAD *
Resident DétailCommande_new;
DROP Table DétailCommande_new;
//STORE [$(TableName)] INTO [$(vFileName)] (qvd);
//DROP TABLE [$(TableName)];
Merci encore pour toutes ses précieuses réponses,
Hello Boris,
tu peux gagner beaucoup de temps sur le Max avec quelque chose de ce genre :
LOAD
max(FieldValue('OrderDate', recno())) as maxdate
AUTOGENERATE FieldValueCount('OrderDate');
Cela permet de lire un champ (donc uniquement les valeurs uniques) et est la solution la plus rapide.
J'avais trouvé ça sur ce post : https://qlikviewcookbook.com/2013/09/fastest-method-to-read-maxfield-from-a-qvd/
Have fun
Brice
Merci Brice,
Très intéressant comme post.
Si vous lisez les commentaires, vous verrez qu'il y a une méthode encore plus efficace :
LOAD Id FROM data.qvd(qvd) WHERE NOT EXISTS(Id);
LOAD max(Id) Resident Max;
Merci pour le lien Brice, comme dit Sébastien très intéressant.
Par contre j'ai plus de difficulté que vous deux à comprendre du premier coup d’œil, mais à testé
Encore merci à vous deux pour toutes les informations transmises à travers se poste.