m1nus
Messages postés5Date d'inscriptionmardi 8 avril 2003StatutMembreDernière intervention18 septembre 2007
-
18 sept. 2007 à 19:00
m1nus
Messages postés5Date d'inscriptionmardi 8 avril 2003StatutMembreDernière intervention18 septembre 2007
-
18 sept. 2007 à 22:40
Bonjour,
Je viens solliciter votre aide car je me trouve face à un petit problème de lenteur de mon programme.
En fait, je dois créer un programme de statistiques dont les données proviennent de plusieurs bases de données indépendantes.
Ce que j'ai fait afin de rassembler toutes les données, c'est parcourir la plus grosse table avec un recordset, et pour chaque recordset, aller retrouver son équivalent dans les 3 autres tables indépendantes. Une fois les données recueillies, je les insère dans une nouvelle table temporaire qui me servira aux statistiques.
Seulement cela prend énormément de temps. En effet, ce sont des tables qui contiennent plusieurs milliers de lignes. Et les parcours sont donc nombreux.
J'ai essayé de 2 manières différentes, soit en recréant des accès aux 3 autres tables a chaque movenext du recordset de la table principale, soit en faisaint une requête plus générale des 3 tables et en les parcourant toutes a chaque recordset de la table principale.
Mais dans les deux cas c'est très (trop) lent (6-7 minutes pr générer 5-6000 lignes)
Je ne sais pas si j'ai été assez clair car le projet est un peu bancal à la base mais si vous pourriez m'aider ca serait vmt vmt sympa.
m1nus
Messages postés5Date d'inscriptionmardi 8 avril 2003StatutMembreDernière intervention18 septembre 2007 18 sept. 2007 à 20:03
Non mes tables ne sont pas indexées, je les reçois telles quelles. Je peux rajouter un index par après ?
Mais une fois la raquête chargée dans le recordset, il n'y a plus d'accès à la table quand même ? Ou bien le recordset ne fait que le lien avec les enregistrements de la table?
Voici un bout de code (un peu brouillon excusez-moi, mais c'est fait en rush)
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 18 sept. 2007 à 20:44
il doit manquer un loop à la fin non?
bref, ici en voulant trop réduire ton code, tu fais des traitements et des tests inutiles
comme tu boucles sans cesse, regarde bien tes if....
les conditions sont énormes, certains arguments sont trouvés (forcément, pour avoir 6000 lignes au final), mais PEUT-ÊTRE qu'en séparant chaque if, tu gagnerais du temps (au détriment de la lisibilité mais bon)
comme çà tu ne fais pas un test d'objets lourds pour rien.
reste aussi à voir qu'est-ce qui te semble (comme résultat) le plus fréquent (true), pour placer les conditions de manière justement à faire le moins de sauts possible
pour la grosse partie çà donne un truc de ce genre :
Dim sUpDateTime As String
Do Until myRec4.EOF Or trouve
If (myRec4!traderstatus = 1) Then
sUpDateTime = CStr(myRec4!updatetime)
If (CLng(Mid$(sUpDateTime, 12, 2) & Mid$(sUpDateTime, 15, 2) & Mid$(sUpDateTime, 18, 2) & Mid$(sUpDateTime, 21, 3)) <= myRec!updtime) Then
Do Until myRec3.EOF Or trouve
If (myRec3!memberstatus = 1) Then
If (myRec3!updatetime <=
myRec!updtime) Then
Do Until myRec5.EOF Or trouve
If (myRec5!member = myRec!MEMBERCODE)
And (myRec5!bondcode =
myRec!bondcode) Then
If FormatNumber(pr_spread, 2) <= FormatNumber(myRec5!spread, 2) Then
If (myRec!bid_block_qty >=
myRec5!qty) Or (myRec!ask_block_qty >= myRec5!qty) Then
sSQL = ("INSERT INTO props (PROPDATE,
MEMBERCODE, OPERATOR, BONDCODE, BONDTYPE, UPDTIME, DURATION, BID_PRICE,
ASK_PRICE, PRICE_SPREAD, BID_YIELD, ASK_YIELD, YIELD_SPREAD, BID_BLOCK_QTY,
ASK_BLOCK_QTY) " & _
"VALUES ('" & myRec!PROPDATE & "',
'" & myRec!MEMBERCODE & "', '" & myRec!Operator & "',
'" & myRec!bondcode & "', '" & myRec!bondtype & "',
" & myRec!updtime & ", " & duree & ", " & myRec!BID_PRICE & ",
" & myRec!ASK_PRICE & ", " & pr_spread & ", " & myRec!BID_YIELD & ",
" & myRec!ASK_YIELD & ", " & yi_spread & ", " & myRec!bid_block_qty & ",
" & myRec!ask_block_qty & ");")
Set myRec2 =
conn2.Execute(sSQL)
trouve = True
cpt = cpt + 1
Else
myRec5.MoveNext
End If
Else
myRec5.MoveNext
End If
Else
myRec5.MoveNext
End If
Loop
Else
myRec3.MoveNext
End If
Else
myRec3.MoveNext
End If
Loop
Else
myRec4.MoveNext
End If
Else
myRec4.MoveNext
End If
Loop
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Vous n’avez pas trouvé la réponse que vous recherchez ?
Dans ce cas, le curseur va directement se placer à l'enregistrement qui convient et je ne devrai pas parcourir tout le recordset et faire les tests "IF THEN ELSE".
Ensuite, à la fin du 1er traitement je remets un filtre vide :
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 18 sept. 2007 à 21:33
beh c'est le but de l'index et du filtre donc çà devrait accelèrerer grandement
mais pas forcément pour remplacer TOUS les if ; le filtre prend aussi ses ressources...
ajoute des tests plus précis (tu peux encore séparer 2 fois sur myRec5!, avec un choix judicieux d'ordre des conditions, à mon avis tu peux réduire d'un tiers ou de moitié le temps d'execution oui
bon courage
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp