Avatar billede madeindk Nybegynder
28. maj 2006 - 02:21 Der er 12 kommentarer og
1 løsning

Forbedring af kode - hvordan?

Hej eksperter! Jeg har i øjeblikket et rimelig stort problem - jeg har en side med en masse billeder og min database går virkelig slow når den skal vise hvilke nogle fotoalbums der er tilføjet. Jeg kører på en MySQL server og koden nedenfor jeg har smidt er den eneste side der går slow - jeg tænker lidt over om det er forbi jeg ikke kan finde ud af at lukke mine forbindelser eller fordi jeg bruger for meget at den skal tælle billederne, for det gør den nemmelig på denne her side, jeg har aldrig haft problemet før.

    <table border="0" width="97%" id="table3" cellspacing="0" cellpadding="0">
   
    <tr>
    <td height="24" class="Menu" colspan="2">&nbsp;&nbsp;<b><font color="#FFFFFF">Du er her:</b> Fotoalbums -> <%=categoryName%></font></td>
    </tr>
   
    <%
    Set objConn = Server.CreateObject("ADODB.Connection")
    ' DB forbindelse fjernet
   
    SQL = "SELECT * FROM partys WHERE partyCategory='"&request("id")&"' AND Approved=1 ORDER BY id DESC"
    set RS = objConn.Execute(SQL)
   
    if rs.eof then
    %>
   
    <tr><td height="25" align="center"><br><b>Der er i øjeblikket ingen fester tilføjet i denne kategori!</td></tr>
   
    <% else %>
   
    <tr>
    <td>&nbsp;
   
    <!-- Fester -->
   
    <center><table border="0" width="550" align="center"><tr>
   
    <table><tr>
    <%
    AntalKolonner = 2
    rowCounter = 0
    counter = 0
    AktuelSide = "0" & cstr(Request.QueryString("side"))
    AntalPrSide = AntalKolonner * 7  ' 4 linier med 5 i hver
    startRow = AktuelSide * AntalPrSide
    bMoreRows = false
   
    farve = "ff0000" ' sæt farven til "rød"
   
    do until rs.eof
       
    if rowCounter >= startRow and rowCounter < startRow + AntalPrSide then 
    response.Write ""
       
    Set objConn = Server.CreateObject("ADODB.Connection")
    ' DB forbindelse fjernet   
   
    SQL1 = "select count(*) as pictures FROM partyPic WHERE partyid=" & rs("id")
    set RS1 = objConn.Execute(SQL1)
    countPictures = rs1("pictures")
   
    SQL1 = "SELECT * FROM PartyPic WHERE picWidth='640' AND partyid=" & rs("id")
    set RS1 = objConn.Execute(SQL1)
       
    titel = rs("party")
    if len(titel) > 26 then
    titel = "" & left(titel, 26) & " .."
    end if
    %>
    <td width="275">
   
    <!-- <%=rs("party")%> -->
   
    <table width="275" cellpadding="2" cellspacing="0"><tr onMouseOver="this.style.backgroundColor='#EEEEEE'" onMouseOut="this.style.backgroundColor='#FFFFFF'">
   
    <% if countPictures > "0" then %>
    <td width="60" align="left"><a target="_self" title="<%=rs("party")%>" href="ViewParty.asp?ID=<%=rs("id")%>" onclick="location.href='ViewParty.asp?ID=<%=rs("id")%>';" style="cursor: pointer; cursor: hand;"><img height="50" class="PictureStroke" src="<%=pictureUrl%>/Party/Thumb/<%=rs1("url")%>.jpg"></a></td>
    <% else %>
    <td width="60" align="left"><a target="_self" title="<%=rs("party")%>" href="ViewParty.asp?ID=<%=rs("id")%>" onclick="location.href='ViewParty.asp?ID=<%=rs("id")%>';" style="cursor: pointer; cursor: hand;"><img height="50" class="PictureStroke" src="/Pictures/grafik/ingen_festBilleder.gif"></a></td>
    <% end if %>
   
    <td width="215" align="left" valign="top" onclick="location.href='ViewParty.asp?ID=<%=rs("id")%>';" style="padding-left:4px; cursor: pointer; cursor: hand;"><b><a target="_self" title="<%=rs("party")%>" href="ViewParty.asp?ID=<%=rs("id")%>"><%=titel%></a></b><br><%=countPictures%> billeder tilføjet i alt<br><br><i><%=rs("city")%> - <%=rs("peoples")%> personer</i></td>
   
    </tr></table>
   
    <!-- / <%=rs("party")%> -->
   
    </td>
    <%
        RS.MoveNext       
   
        counter = counter + 1
        if counter mod AntalKolonner = 0 then
          response.Write "</tr>"
          if not RS.eof then
            response.Write "<tr>"
          end if
        end if
   
      else
        RS.MoveNext
        if rowCounter > startRow + AntalPrSide then
          bMoreRows = NOT RS.EOF
          exit do
        end if
      end if
      rowCounter = rowCounter + 1
    loop
           
    ' udfyld resten af cellerne i den aktuelle række
    do while counter mod AntalKolonner <> 0
      response.Write "<td width='240'>&nbsp;</td>"
      counter = counter + 1
    loop
   
    ' afslutter rs.eof
    end if
   
    objConn.Close
    %>
   
    </tr>
    </table>
Avatar billede Slettet bruger
28. maj 2006 - 02:41 #1
Hej...
tjae... det ville være en god idé at lukke forbindelserne... og også KUN have én forbindelse som så bliver genbrugt...

Prøv dette:
    <table border="0" width="97%" id="table3" cellspacing="0" cellpadding="0">
   
    <tr>
    <td height="24" class="Menu" colspan="2">&nbsp;&nbsp;<b><font color="#FFFFFF">Du er her:</b> Fotoalbums -> <%=categoryName%></font></td>
    </tr>
   
    <%
    Set objConn = Server.CreateObject("ADODB.Connection")
    ' DB forbindelse fjernet
   
    SQL = "SELECT * FROM partys WHERE partyCategory='"&request("id")&"' AND Approved=1 ORDER BY id DESC"
    set RS = objConn.Execute(SQL)
   
    if rs.eof then
    %>
   
    <tr><td height="25" align="center"><br><b>Der er i øjeblikket ingen fester tilføjet i denne kategori!</td></tr>
   
    <% else %>
   
    <tr>
    <td>&nbsp;
   
    <!-- Fester -->
   
    <center><table border="0" width="550" align="center"><tr>
   
    <table><tr>
    <%
    AntalKolonner = 2
    rowCounter = 0
    counter = 0
    AktuelSide = "0" & cstr(Request.QueryString("side"))
    AntalPrSide = AntalKolonner * 7  ' 4 linier med 5 i hver
    startRow = AktuelSide * AntalPrSide
    bMoreRows = false
   
    farve = "ff0000" ' sæt farven til "rød"
   
    do until rs.eof
       
    if rowCounter >= startRow and rowCounter < startRow + AntalPrSide then 
    response.Write ""
       
    ' DB forbindelse fjernet   
   
    SQL1 = "select count(*) as pictures FROM partyPic WHERE partyid=" & rs("id")
    set RS1 = objConn.Execute(SQL1)
    countPictures = rs1("pictures")
    RS1.close
    set RS1=nothing
    SQL1 = "SELECT * FROM PartyPic WHERE picWidth='640' AND partyid=" & rs("id")
    set RS1 = objConn.Execute(SQL1)
       
    titel = rs("party")
    if len(titel) > 26 then
    titel = "" & left(titel, 26) & " .."
   
    end if
    %>
    <td width="275">
   
    <!-- <%=rs("party")%> -->
   
    <table width="275" cellpadding="2" cellspacing="0"><tr onMouseOver="this.style.backgroundColor='#EEEEEE'" onMouseOut="this.style.backgroundColor='#FFFFFF'">
   
    <% if countPictures > "0" then %>
    <td width="60" align="left"><a target="_self" title="<%=rs("party")%>" href="ViewParty.asp?ID=<%=rs("id")%>" onclick="location.href='ViewParty.asp?ID=<%=rs("id")%>';" style="cursor: pointer; cursor: hand;"><img height="50" class="PictureStroke" src="<%=pictureUrl%>/Party/Thumb/<%=rs1("url")%>.jpg"></a></td>
    <% else %>
    <td width="60" align="left"><a target="_self" title="<%=rs("party")%>" href="ViewParty.asp?ID=<%=rs("id")%>" onclick="location.href='ViewParty.asp?ID=<%=rs("id")%>';" style="cursor: pointer; cursor: hand;"><img height="50" class="PictureStroke" src="/Pictures/grafik/ingen_festBilleder.gif"></a></td>
    <% end if %>
   
    <td width="215" align="left" valign="top" onclick="location.href='ViewParty.asp?ID=<%=rs("id")%>';" style="padding-left:4px; cursor: pointer; cursor: hand;"><b><a target="_self" title="<%=rs("party")%>" href="ViewParty.asp?ID=<%=rs("id")%>"><%=titel%></a></b><br><%=countPictures%> billeder tilføjet i alt<br><br><i><%=rs("city")%> - <%=rs("peoples")%> personer</i></td>
   
    </tr></table>
   
    <!-- / <%=rs("party")%> -->
   
    </td>
    <%
        RS1.close
        set RS1=nothing
        RS.MoveNext       
   
        counter = counter + 1
        if counter mod AntalKolonner = 0 then
          response.Write "</tr>"
          if not RS.eof then
            response.Write "<tr>"
          end if
        end if
   
      else
        RS.MoveNext
        if rowCounter > startRow + AntalPrSide then
          bMoreRows = NOT RS.EOF
          exit do
        end if
      end if
      rowCounter = rowCounter + 1
    loop
           
    ' udfyld resten af cellerne i den aktuelle række
    do while counter mod AntalKolonner <> 0
      response.Write "<td width='240'>&nbsp;</td>"
      counter = counter + 1
    loop
   
    ' afslutter rs.eof
    end if
    rs.close
    set rs=nothing
    objConn.Close
    set objConn=nothing
    %>
   
    </tr>
    </table>

\Dan
Avatar billede madeindk Nybegynder
28. maj 2006 - 02:53 #2
Jeg har nu sat din kode ind og det fungerer fint, men det går stadig super slow!

Jeg sidder på lokalt netværk med serveren og jeg vil skyde det til at tage omkring 15 sekunder at hente følgende side: http://alcopeople.dk/PartyGallery/ViewCategory.asp?ID=2
Avatar billede Slettet bruger
28. maj 2006 - 03:02 #3
tjae det har du ret i... det går ikke ret hurtigt...

- men hvordan er dit system opbygget? Er din SQL-server og din webserver to adskilte maskiner?

Jeg tvivler nu på at det er scriptet som sådan der er skyld i det her... men nok snarere noget med belastning af server eller din SQL-connection...

- ellers har jeg ikke lige noget genialt bud på hvad der kan være galt...

\Dan
Avatar billede madeindk Nybegynder
28. maj 2006 - 03:05 #4
Hmm ok. Forstår det godt nok heller ikke - det går hurtigt nok på alle andre sider, bare ikke på sider med fotoalbums... Der er sider der er en del mere krævende end lige den og der går det hurtigt nok.

Men nej, SQL serveren og webserveren er den samme server.
Avatar billede jokkejensen Novice
28. maj 2006 - 04:26 #5
Prøv før alt det kode du mener kan drille, at udskrive den fulde dato, og igen bagefter - så får du et godt indsigt i om det er dine database kald der er utroligt langsomme..
Avatar billede madeindk Nybegynder
28. maj 2006 - 14:59 #6
Hvordan mener du 'jokkejensen' ?
Avatar billede softspot Forsker
28. maj 2006 - 15:10 #7
Jeg tror dit problem er at du vælger mange data for at vise ganske få informationer. Der er 14 forskellige fester på den side og der er ikke umiddelbart data fra mere end 5 kolonner, alligevel udvælger du * (samtlige kolonner) i de tabeller du udvælger fra. Ydermere vælger du data i et loop, hvilket betyder at du skal omkring databasen mange gange. Du bør samle din forspørgsel med joins og subqueries, da det oftest vil performe langt bedre end at udføre en masse simple forspørgsler i databasen.

Jeg er desværre ikke bekendt med MySQL syntaks og kan derfor ikke lige strikke en forspørgsel sammen som løser dit problem, men det kan være der er nogle af de andre som lige kan flikke nogle joins sammen til dig...
Avatar billede madeindk Nybegynder
28. maj 2006 - 16:30 #8
Jamen, jeg forstår bare ikke hvorfor den pludselig opfører sig sådan. Den har aldrig gjort det før, men jeg burde nok forbedre mine SQL syntaxer en smule som du selv siger. De trænger til lidt vedligeholdelse :-)
Avatar billede softspot Forsker
28. maj 2006 - 16:38 #9
Grunden kan være at der er kommet mange flere data i tabellerne end der har været før og at du derfor skal transportere langt mere end tidligere. Netop derfor er det også vigtigt kun at hente de data der er behov for (eller i det mindste så tæt ved som muligt :)).
Avatar billede madeindk Nybegynder
28. maj 2006 - 16:44 #10
Ok - men lige pt. er der 14 fester på den der side og den anden dag var der 12 og der gik det hurtigt nok, 2 kan da ikke gøre den store forskel? Mon jeg burde skrive koden forfra :-)
Avatar billede softspot Forsker
28. maj 2006 - 18:24 #11
Nej, det kan du have ret i... Er der nogle "store" felter i dine tabeller (f.eks. beskrivelse el. lign.), som evt. kunne bevirke at transporten fra databaseserveren til webserveren kunne blive langsom, eller er serveren MEGET travl (som dannielsen også var inde på)? Og så er det nok en god idé at forsøge med nogle performancemålinger som jokke er inde på, dvs. prøv at aflæse timer før og efter en funktionalitet - det vil afsløre hvor tiden bliver brugt og dermed give dig en idé om hvor du skal sætte ind med optimering. Timer returnerer et decimalt tal som angiver tiden siden maskinen blev startet og tæller, om ikke milisekunder så noget der kan bruges til forholdsvis korte operationer. Den er derfor en god indikator der kan benyttes således:

startConnect = timer
' udfør f.eks. connection til databasen
slutConnect = timer
forbrugConnect = slutConnect - startConnect

startQuery = timer
' hent data i databasen
slutQuery = timer
forbrugQuery = slutQuery = startQuey

og så fremdeles. Start- og slut-variablerne indeholder indikationer af hvornår funktionerne er startet og sluttet og forbrug-variablerne indeholder det faktiske forbrug i ms (det er ikke helt nøjagtigt ned til ms, min erfaring siger at der kan måles ned til 15 ms intervaller - derfor kan du også godt opleve funktioner som ikke tager noget tid - altså rapporterer 0,000... men det er jo bare godt :)).

Du kan enten skrive resultatet ud med det samme, eller gemme målingerne til sidst og så udskrive dem i en samlet rapport.
Avatar billede madeindk Nybegynder
28. maj 2006 - 18:48 #12
God ide du fik der. Har fundet noget her: http://alcopeople.dk/PartyGallery/ViewCategory.asp?ID=2

Klik derind og klik derefter "Vis kilde" / "View source" :-)
Jeg har bare lavet en now() funktion der udskriver det i kommenteret tekst. Det tager et sted i mellem 1 og 2 sekunder for HVER fest :S
Avatar billede madeindk Nybegynder
28. juni 2006 - 14:47 #13
Jeg fandt selv en løsning på problemet - jeg slap af med de count funktioner. Skal vi deles om point softspot?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester