[algo] Optimisation code

Salut à tous,
Je fais appel aux grand pros d'algo!
Je travaille sur un script ASP qui attaque une base MS-SQL, et vu l'importance du nombre d'enregistrements, ce script met plus d'une heure à s'exécuter.
Etant donné que je l'ai développé seul, je n'ai pas l'esprit critique que des personnes extérieures au projet (vous ;-) )peuvent avoir. Alors si vous avez 2-3 conseils pour accélérer mon traitement, faites en part!
Merci d'avance.

' On selectionne tous les numéros de fiche_produit, et pour chaque on recense dans chaque
' localisation combien de produits de ce type il existe.
query = "SELECT no_fiche_produit FROM fiche_produit"
RSfp.Open query, connexion, 3, 3
query = "SELECT no_localisation FROM localisation"
RSloc.Open query, connexion, 3, 3
		
nb = 0
while not RSfp.eof
	while not RSloc.eof
		query = "SELECT no_produit FROM produit WHERE no_localisation=" & RSloc("no_localisation") & " AND no_fiche_produit=" & RSfp("no_fiche_produit")
		RSnb.Open query, connexion, 3, 3
		cpt = RSnb.RecordCount
		if cpt <> 0 Then
			query = "INSERT INTO tdbord_historique (date_entree, quantite, no_fiche_produit, no_localisation) VALUES ('" & jour & "', " & cpt & ", " & RSfp("no_fiche_produit") & ", " & RSloc("no_localisation") & ")"
			 connexion.execute query
			nb = nb+1
		end if
		RSnb.Close
		RSloc.MoveNext
		if nb mod 100 = 0 Then
			Response.write(nb & " : " & query & "<BR/>")
			Response.Flush()
		end if
	wend
	RSloc.MoveFirst
	RSfp.MoveNext
wend
RSfp.Close
Set RSfp = Nothing
RSloc.Close
Set RSloc = Nothing
Set RSnb = Nothing


Bon courage!

Fat_cartman,
Ass-Kicked by ASP

4 réponses

  1. salut
    essais de trier tes données avant de les exploiter.
    comme ça tu vas diminuer la complexité de ton algo et donc tu gagnera du temps.
    1. Je ne vois pas de tri possible, je dois recenser le nombre de produits par localisation.
      As tu un tri en tete à me proposer??

      Fat_cartman,
      Ass-Kicked by ASP
      1. Contributeur
        salut, tu ne sais pas que t'as l'agregat count pour compter et group by pour regrouper ???
        Ou bien j'ai rien compris ??

        tafiscobar "lou waye def bopame"
        la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
      2. Si si, y'a bien une histoire de COUNT, mais je ne l'utilise pas à cause de certains problemes liés au recordset. Mais je vais essayer quand meme quand ca aura fini de tourner....
        T'as une proposition de requete, je te dirai si t'as bien compris ou pas.

        Fat_cartman,
        Ass-Kicked by ASP
      3. Contributeur
        @Utilisateur anonymej'aime pas trop lire du code vb (ou ressemblant), mais apparemment, tu veux le nombre de produits par localisation :
        select  l.no_localisation, count(p.no_produit)
        from localisation l, produit p
        where p.no_localisation = l.no_localisation
        group by l.no_localisation
        order by l.no_localisation ASC;
        


        tafiscobar "lou waye def bopame"
        la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
    2. Contributeur
      Puis sinon si le nombre d enregistrements est vraiment important il devient util de faire un index....ca optimise les accés à mort ;-)
      1. Merci aux participants, le plus proche est tafiscobar (respect), j'ai trouvé la solution en parrallele qui est :
        SELECT localisation.no_localisation, produit.no_fiche_produit, COUNT(no_fiche_produit) 
        FROM localisation, produit 
        WHERE produit.no_localisation = localisation.no_localisation 
        GROUP BY produit.no_fiche_produit, localisation.no_localisation 
        ORDER BY localisation.no_localisation, produit.no_fiche_produit ASC 
        


        Requete tres bonne puisqu'elle ne me sort pas tous les no_fiche_produit dans les no_localisation dont le COUNT est égal à 0!
        Donc seulement 4459 enregistrements à la place de.... 56000 au début....

        Bonne journée à tous!

        Fat_cartman,
        Ass-Kicked by ASP