28. maj 2006 - 02:21Der 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.
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'> </td>" counter = counter + 1 loop
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) & " .."
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'> </td>" counter = counter + 1 loop
' afslutter rs.eof end if rs.close set rs=nothing objConn.Close set objConn=nothing %>
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.
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..
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...
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 :-)
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 :)).
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 :-)
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.
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
Jeg fandt selv en løsning på problemet - jeg slap af med de count funktioner. Skal vi deles om point softspot?
Synes godt om
Ny brugerNybegynder
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.