Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Langages serveur > ASP
ASP Forum sur la programmation ASP. Avant de poster : Cours ASP, FAQ ASP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/06/2007, 17h53   #1
Membre du Club
 
Inscription : février 2007
Messages : 172
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 172
Points : 44
Points : 44
Par défaut optimisation temps de réponse

salut,
j'aurais voulut savoir comment optimiser le temps de réponse de mes pages asp?
Ma base (access) semble etre optimiser j'ai des index, etc..

merci.
mohcultiv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2007, 10h48   #2
J1
Membre actif
 
Inscription : mai 2004
Messages : 225
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 225
Points : 195
Points : 195
Bonjour,

un des tutoriels du site aborde la question.
J1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2007, 11h47   #3
Membre du Club
 
Inscription : février 2007
Messages : 172
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 172
Points : 44
Points : 44
Merci, j'ai suivi les indications de ce tutoriel mais cela n'à accéléré mon script que de quelque secondes (35 au lieu de 40, je voudrais au moins arriver à 15 sinon mon projet ne sera pas validé)

Bizzarement lorsque je rajoute le <% OPTION EXPLICIT %> mon script est plus long, alors que d'apres le tuto cela devrait l'accélérer.

j'attend toujours d'autre solution merci.
mohcultiv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2007, 17h33   #4
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
Bonjour

35 secondes me semblent énormes !!

j'ai personnellement la même architecture (asp + access), les temps d'interrogation des tables les plus "lourdes" (de l'ordre de 600.000 enregistrements) ne prennent que quelques secondes (5 au grand maxi)

Citation:
Ma base (access) semble etre optimiser j'ai des index,
En es tu bien sûr ? j'avais réussi à obtenir ces temps de réponses en définissant justement les bons index au bon endroit. (avant, j'avais aussi des temps de réponse énormes, supérieurs à la minute)
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2007, 18h03   #5
Membre du Club
 
Inscription : février 2007
Messages : 172
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 172
Points : 44
Points : 44
oui je suis bien sur!

j'ai mis des index dans tout les champs où je faisait des recherches, comparaisons, etc..

Je ne vois pas où je peux en mettre d'autre si ce n'est en en mettant dans tout les champs, mais je pense pas que cela serve à grand chose.

Le temps d'éxécution qui est si enorme vient d'une requete laquelle je parcours à l'aide d'une boucle elle meme contenue dans une autre boucle.

le nombre de passage dans la premiere boucle dépend du nombre de choix de l'utilisateur dans la premiere page .
pour chaques choix de l'utilisateur je dois afficher des valeurs pour 52 semaines= 2ème boucle.

autrement dis si 10 choix sont selectioné alors je vais boucler 10 fois et dans chaque bouclage je reboucle 52 fois.


je sais que je suis pas tres clair mais je pense et je suis sur que le temps aussi grand que met mon script a etre executé viens de là et non pas de ma table qui je le répète est bien optimisée.


Merci encore.
mohcultiv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 09h31   #6
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
Bonjour

Si on peut voir la requete et/ou l'algo que tu utilises, il doit y avoir moyen d'optimiser, car effectivement, des boucles dans des boucles, "ça bouffe"

Si tu execute 52 * 10 requetes (si j'ai bien compris), effectivement, Access, même avec la meilleure volonté du monde, doit montrer ses limites.

Le principe serait d'écrire une requete et une seule contenant tout ce dont tu as besoin, puis de gérer les ruptures par prog (si c'est possible, il faut connaitre ta BdD pour voir ça)
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 10h49   #7
Membre du Club
 
Inscription : février 2007
Messages : 172
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 172
Points : 44
Points : 44
Je te remercie de ta reponse, en effet j'ai trouvé un moyen de sortir ma requete de la boucle et , en effet cela m'a permis de diviser le temps d'éxécution par 3.
Cepandant, j'ai une autre requete que je pourrais sortir de la boucle, mais en utlisant la méthode find, car j'ai un critere qui evolue dans ma boucle.

Le souci c'est que ASP ne semble pas reconnaitre la methode find et j'obtiens une erreur du type:

ADODB.Recordset (0x800A0CC1)
Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandé

ex:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
<tr>
<%
rercordset.source="select * from valeur where année = 2006"
recordset.open
 
for semaine=1 to 52
recordset.Find("semaine=" & semaine)%>
 
<td><%=recordset("valeur")%></td>
<%next%>
 
</tr>
cet exemple doit afficher 52 colonne avec la valeur de chaque semaine (1 semaine par valeur)

le problème vient du find, et j'ai testé
Code :
recordset.Find("semaine=" & 2)
car je suis sur que j'ai dans ma base une valeur pour la semaine 2 mais toujours la meme erreur.
mohcultiv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 11h12   #8
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
Citation:
ADODB.Recordset (0x800A0CC1)
Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandé
Cette erreur vient normalement du fait qu'il n'y a pas de champs nommé "semaine" dans ta table "valeur"



PS : eviter autant que possible les accents dans les noms de champs, ainsi que les espaces
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 11h21   #9
Membre du Club
 
Inscription : février 2007
Messages : 172
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 172
Points : 44
Points : 44
Citation:
Envoyé par roro06
PS : eviter autant que possible les accents dans les noms de champs, ainsi que les espaces

Je sais mais je n'avais pas le choix pour nommer mes champs.


Citation:
Envoyé par roro06
Cette erreur vient normalement du fait qu'il n'y a pas de champs nommé "semaine" dans ta table "valeur"

Pourtant il y a bien un champs nommée semaine dans ma table, je pense que cela vient de la methode find, car si je rajoute le critere dans ma requete ca fonctionne

Code :
"select * from valeur where année=2006 and semaine=" & semaine
ceci fonctionne mais il faut que la requete soit dans la boucle car semaine est incrémentée de 1 à 52.
Or c'est ce que je cherche à éviter.

Peut etre que j'utilise mal cette methode mais dans tous les tutoriels que j'ai trouvé c'est comme ça que c'était expliqué.

J'ai essayé la métrhode filter mais j'ai le meme msge d'erreurs.
mohcultiv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 11h28   #10
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
le mieux que je ferai, c'est :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
<%
recordset.source="select * from valeur where année = 2006 order by semaine"
recordset.open
 
while not recordset.eof %>
 
<td><%=recordset("valeur")%></td>
<%
   recordset.movenext
wend%>
Ceci a condition d'être certain que toutes les semaines sont bien présentes dans la table
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 11h55   #11
Membre du Club
 
Inscription : février 2007
Messages : 172
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 172
Points : 44
Points : 44
le souci est là, il peut y avoir des semaines abscentes dans la table, alors voilà ce que j'ai fait:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<%
recordset.source="select * from valeur where année = 2006 order by semaine"
recordset.open
 
for i= 1 to 52
   if not recordset.eof
       if recordset("semaine")=i then
          <td><%=recordset("valeur")%></td>
      <%end if
 
     recordset.movenext
  end if
Next%>
mohcultiv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 12h14   #12
Membre du Club
 
Inscription : février 2007
Messages : 172
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 172
Points : 44
Points : 44
cela fonctionne, mais en réalité le problème est un peu plus complexe, mais je ne voulais pas précipité les choses

en fait cette boucle est contenue dans une autre boucle:



Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for l=1 to 2
    recordset.source="select * from valeur where année =" & annee & " order by semaine"
    recordset.open
 
 'code précédent
 
 
    response.write("<tr>")
    if l=1 then         
        annee=annee+1
    else 
        annee= annee-1
    end if
 
    recordset.close
next

mon souci est que le critere annee evolue egalement dans la boucle mais pas de maniere ordonnée, donc je suis obligée de laisser la requete à l'interieur de la boucle, d'où l'utilité de la methode find
mohcultiv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 12h15   #13
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
C'est pas très judicieux :

Ca n'apporte rien par rapport à la solution que je te donnais, au contraire :
imagines que la semaine 1 soit absente de ta table : tu n'aura aucun affichage.

de deux choses l'une (l'autre c'est le soleil ! ) :

Soit tu veux afficher une ligne par semaine présente dans ta table : cf ma soluce précédente

Soit tu veux afficher 52 semaines, et les éventuelles valeurs trouvées dans la table. Dans ce cas, fais :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%
dim cp
cp=1
recordset.source="select * from valeur where année = 2006 order by semaine"
recordset.open
 
while not recordset.eof %>
 
<tr>
<td><%=cp%></td>
<td><%if cp=recordset("semaine") then %><%=recordset("valeur")%><%end if%>&nbsp;</td>
</tr>
<%
cp=cp + 1
   recordset.movenext
wend %>
<% for i=cp to 52 %>
<tr>
<td><%=cp%></td>
<td>&nbsp;</td>
</tr> 
<% next %>
Je pense que ça se rapprochera plus de ce que tu veux.

Les temps de réponse sont ils plus "acceptables" ?
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 12h21   #14
Expert Confirmé
 
Avatar de pc75
 
Inscription : septembre 2004
Messages : 2 810
Détails du profil
Informations personnelles :
Âge : 56
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 2 810
Points : 3 011
Points : 3 011
Re,

Je ne fais que passer, mais j'ai eu à gérer ce genre de calendrier et pour m'en sortir, j'ai été obligé de créer une table des semaines (ANNEE NUMSEMAINE).

J'utilises ensuite cette table pour faire des jointures au cas où dans mes données il y a une semaine qui n'existe pas.
__________________
Par principe, je ne réponds pas aux messages URGENT.
Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
pc75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 12h34   #15
Membre du Club
 
Inscription : février 2007
Messages : 172
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 172
Points : 44
Points : 44
tout d'abord je n'ai pas compris l'interet de ta deuxieme boucle for.
ensuite mais entetes sont deja créé hors de la boucle

for i= 1 to 52
<td><%=i%></td>
next

avec ma methode si une semaine est manquante j'aurais une case vide, et c'est ce que je veux:


entetes: 1 2 3 4 5 6 7 ... 52
valeur: v1 v2 v3 v4 v6 v7 ... v52

c'est ce qu'il m'affiche et c'est ce que je veux.

les temps d'acces sont nettement plus raisonable, mais je pense pouvoir encore les amelioré en resolvant le pb que j'ai soumis juste avant ton poste.

merci
mohcultiv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 12h41   #16
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
j'avais pas vu ce post (le #12)
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 13h31   #17
Membre du Club
 
Inscription : février 2007
Messages : 172
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 172
Points : 44
Points : 44
ok pas de souci, par contre, maintenant que tu la vu lol, t'aurais pas une solution, je suis persuadée qu'avec find ça serait cool, mais bon.
mohcultiv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 14h33   #18
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
N'ayant pas tous les éléments, difficile de répondre. seulement, pour find, il faut savoir qu'il n'autorise des recherches que sur un seul champs :

recordset.find("champs=" & valeur)

ca veut dire qu'il est impossible de faire quelquechose du style :
recordset.fin("champs1=" & valeur & " and champs2=" & valeur2)

ensuite, si tu dois faire plusieurs recherches, il faut "revenir au début" de ton recordset a chaque fois :
if not recordset.bof then recordset.movefirst

recordset.find(...)
if recordset.eof then
' pas trouvé
else
' trouvé !!
end if

il faut aussi avoir pris la précaution de déclarer ton curseur en dynamique :
recordset.cursorType= 2
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 15h40   #19
Membre du Club
 
Inscription : février 2007
Messages : 172
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 172
Points : 44
Points : 44
J'ai remplacé:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for l=1 to 2
    recordset.source="select * from valeur where année =" & annee & " order by semaine"
    recordset.open
 
 
    for i=1 to 52
       [...]
    next
 
 
 
    response.write("<tr>")
    if l=1 then         
        annee=annee+1
    else 
        annee= annee-1
    end if
 
    recordset.close
next
Par:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
    recordset.source="select * from valeur where année =" & annee & " order by semaine"
    recordset.open
 
for l=1 to 2 
     Recordset3.movefirst						
     Recordset3.FIND("année=" & annee)	
 
 
    for i=1 to 52
       [...]
    next
 
 
    response.write("<tr>")
    if l=1 then         
        annee=annee+1
    else 
        annee= annee-1
    end if
 
    recordset.close
next

et j'obtiens l'erreur suivante a la ligne
Code :
Recordset3.FIND("année=" & annee)

erreur:
Code :
1
2
3
 
ADODB.Recordset (0x800A0CC1)
Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandé.

Ps: mon recordset.cursortype vaut 2
mohcultiv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 16h18   #20
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
Je serai toi, je ferais un test sur une autre base de données de test (avec access, c'est rapide), en supprimant cet accent qui me chagrine beaucoup

Encore une fois, cette erreur est donnée par un champs inexistant

Ou peut-etre, essaie ceci :

recordset3.find("[année]=" & annee)

(sans conviction : pas testé)
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h04.


 
 
 
 
Partenaires

Hébergement Web