OVH Cloud OVH Cloud

Optimiser une boucle qui prend 2 jours de traitement ! lol

4 réponses
Avatar
aitoz
Bonjour,

J'ai une boucle qui met 48 heures a se terminer.

je regarde a chaque code article la somme des quantités expédiées dans une
période.
le seul probleme est que ma table fait 200 méga et que ca prend un temps
fou.
Je me souviens une fois avoir optimiser ma boucle et j'avais gagné
énormément de temps.
Quelqu'un pourrait me dire si je peux l'optimiser

For y = 0 To CInt(Ds.Tables(0).Rows.Count.ToString) - 1

Requ = "SELECT ex_arti, SUM(ex_nbre) AS Expr1" _
& " FROM gpexpedi " _
& " WHERE (ex_dsai BETWEEN {" & Format(Date_Min, "MM/dd/yyyy") & "} AND {" &
Format(Date_Max, "MM/dd/yyyy") & "})" _
& " GROUP BY ex_arti" _
& " HAVING (ex_arti =" & Chr(39) & Ds.Tables(0).Rows(y).Item(0) & Chr(39) &
")"

Dc_EXP.CommandText = Requ
Da_EXP.SelectCommand = Dc_EXP
Da_EXP.Fill(Ds_EXP)
Ds_EXP.Clear()

Next y

4 réponses

Avatar
aitoz
Je vais essayer autrement !
Je vais essayer de faire d'abord une requete select de tous les articles.
Sans tenir compte du code article en cours.
Et ensuite je ferais une boucle sur mon dataset provisoir pour récupérer la
quantité en stock.

Je sais c'est super mal optimisé. Mais c a cause de ma base, une vielle
FoxPro 2.0 tout pourrie avec laquelle il est impossible de faire des liens
correcte.
Je suis contraint de faire la requete en deux étapes.

si vous avez une meilleur idée ?!

Merci beaucoup
Avatar
aitoz
Ouais chouette !

au lieu de 74heures de calcul, j'ai optimisé a 2 minutes 37s en moyenne.
J'ai fais comme j'avais dis. J'ai d'abord stocké dans mon dataset et ensuite
j'effectue une boucle.

C'est pas forcement le bon choix, je pourrais peut etre regardé du coté des
relations, mais bon !
Pas assez de temps et trop compliqué !
Voila, sachez donc que les opérations sur le dataset vont 1000 fois plus
vite que de faire des ouvertures fermetures sur la base.
Logique non ? ;-)
Avatar
Guillaume Davion
Sinon, une autre solution si tu sais que ta requete ne récupère
qu'une seule valeur, c'est de faire un executeScalar sur la commande
plutot que de faire un fill de dataset.
Je ne sais pas si ce sera plus rapide que ta méthode (pas sur)
Avatar
Zoury
Salut ! :O)

Je ne sais pas si ce sera plus rapide que ta méthode (pas sur)



J'en mettrais ma main au feu.. :O)

--
Cordialement
Yanick
MVP pour Visual Basic