Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Lenteur lors d'un chargement incrémental [QVD > 100 Millions de lignes]

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,

17 Replies
Anonymous
Not applicable
Author

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

sfatoux72
Partner - Specialist
Partner - Specialist

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.

Anonymous
Not applicable
Author

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

sfatoux72
Partner - Specialist
Partner - Specialist

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)];

Anonymous
Not applicable
Author

Merci encore pour toutes ses précieuses réponses,

Brice-SACCUCCI
Employee
Employee

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

sfatoux72
Partner - Specialist
Partner - Specialist

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;

Anonymous
Not applicable
Author

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.