Avatar billede justdoit Nybegynder
25. oktober 2002 - 17:31 Der er 14 kommentarer og
2 løsninger

Underlig langsom udtræk fra DB

Jeg har en underlig oplevelse lige i øjeblikket! jeg er ved at lave en site med ASP/MYSQL og det virker fint, men det går utrolig langsomt når jeg skal udskrive noget fra DB'en, og jeg har tjekket at der ikke er fordi jeg looper noget!

Men det mærklige er også, at et gammelt site jeg har lavet i Access, som virkede fint da jeg lavede det, - det er også blevet utroligt langsomt, og det var det ikke før???

Hvad kan der være galt??
Avatar billede morw Nybegynder
25. oktober 2002 - 19:35 #1
lad os se koden + db oplysninger
Avatar billede justdoit Nybegynder
25. oktober 2002 - 22:57 #2
<% Dim StartTime, EndTime, n
StartTime = GetTime() %>
                                  <%                                 
Dim ConString, Conn

'Åbner connection
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open ConString 
sql = "SELECT * FROM Kategori"
Set objRec = Server.CreateObject("ADODB.Recordset")
objRec.open sql, Conn
%>
<table width="520" border="0" cellspacing="0" cellpadding="0">
  <% While NOT objRec.EOF
Dim Conn2 
Set Conn2 = Server.CreateObject("ADODB.Connection")
Conn2.Open ConString 
sql2 = "SELECT * FROM U_Katagori WHERE u_kategoriId = " & objRec("kategoriId")
Set objRec2 = Server.CreateObject("ADODB.Recordset")
objRec2.open sql2, Conn2

    If int_count = 0 Then
        Response.Write "<tr>"
    End If
  %>
    <td>   
                                          <table width="260" border="0" cellspacing="0" cellpadding="0">
                                            <tr>
                                              <td rowspan="2" width="5" valign="top"></td>
                                              <td rowspan="2" width="59" valign="top">
                                                <%=("<table width=""55"" height=""55"" border=""0"" cellspacing=""0"" cellpadding=""0""><tr><td background='billeder/upload/forside/"& objRec("kategoriPic") & "' width=""51"" height=""51""><table width=""55"" border=""0"" cellspacing=""0"" cellpadding=""0""><tr><td rowspan=""4"" width=""2"" class=""hvid""></td><td colspan=""2"" height=""2"" class=""hvid""></td><td rowspan=""2"" width=""2"" class=""hvid""></td></tr><tr><td height=""36"" width=""36""></td><td width=""17""></td></tr><tr> <td height=""17""></td><td colspan=""2"" rowspan=""2"" background='billeder/site/forside_transperant.gif' height=""19"" width=""19""></td></tr><tr><td height=""2"" class=""hvid""></td></tr></table></td></tr></table>")%>
                                              </td>
                                              <td rowspan="2" width="9" valign="top"></td>
                                              <td valign="top" class="overskrift_forside"><%=("<a onfocus=""this.blur()"" href=""kategori_all.asp?id=" & objRec("kategoriId") & """>" & objRec("kategoriNavn") & "</a>")%>&nbsp;<span class="hovedtekst_graa">[12]</span></td>
                                        </tr>
                                            <tr>
                                              <td width="191" valign="top" class="hovedtekst">
                                                <%
  Lobs = 8 ' her kan du skrive det antal gange den skal loope

  For X = 1 To Int(Lobs)
    If NOT objRec2.EOF Then
      Response.Write "<a onfocus=""this.blur()"" href=""se_denne_side.asp?kategori=" & objRec2("Id") & """>" & objRec2("u_kategoriNavn") & "</a>"

      objRec2.movenext
 
      'Tilføj denne linje, så der ikke tilføjes "..." eller "," hvis dette var den sidste post
      If objRec2.EOF Then Exit For

      If X < Int(Lobs) Then
        Response.Write ", "
      Else
        Response.Write "..."
      End If
    End If
  Next
  objRec2.close
Conn2.Close
Set Conn2 = Nothing
%>
                                              </td>
                                            </tr>
                                            <tr>
                                              <td height="15"></td>
                                            </tr>
                                          </table>
    </td>
  <%
    If int_count = 1 Then
        Response.Write "</tr>"
        int_count = 0
    Else
        int_count = 1
    End If
   
objRec.MoveNext()
   
Wend
%>
    </table>
<%
objRec.close
Conn.Close
Set Conn = Nothing
EndTime = GetTime()

Response.Write("<p>Eksekveringstid: "& FormatMilliseconds(EndTime-StartTime) &"</p>")
int_count = 0
%>
Avatar billede morw Nybegynder
25. oktober 2002 - 23:05 #3
Har du sat indeks på dine tabeller?

Desuden er det ikke optimalt at lave en lykke inde i en lykke der begge kalder MySQL. Join er bedre eller en arrayløsning.

Skriv kun de feltnavne du skal bruge i stedet for *
Avatar billede proaccess Nybegynder
26. oktober 2002 - 09:34 #4
Det virker som om du kun skal bruge 8 rækker fra dit 2. recordset, du udtrækker bare alle og viser de 8 første...

Prøv i stedet:
sql2 = "SELECT * FROM U_Katagori WHERE u_kategoriId = " & objRec("kategoriId") & " LIMIT 8"

eller hvis du har et spec. felt du vil sortére efter:
sql2 = "SELECT * FROM U_Katagori WHERE u_kategoriId = " & objRec("kategoriId") & " ORDER BY sortFelt LIMIT 8"

Samtidig tilslutter jeg min morw's kommentar om angivelse af index og feltnavne.
Avatar billede proaccess Nybegynder
26. oktober 2002 - 09:35 #5
I Access burde du have haft brugt:
sql2 = "SELECT TOP 8 * FROM U_Katagori WHERE u_kategoriId = " & objRec("kategoriId")

(Access har en anden måde at lave afgrænsningen på)
Avatar billede justdoit Nybegynder
26. oktober 2002 - 11:18 #6
Hvad mener I med om jeg har sat index på mine tabeller??
Avatar billede justdoit Nybegynder
26. oktober 2002 - 11:21 #7
Jeg har prøvet at lave en JOIN funktion, men når jeg lavede den, så fik jeg kun udskrevet nogle af mine underoverskrifter - jeg kunne ikke få den til at udskrive alt det der passede til overskriften!!!

Grunden til at jeg bruger * er at jeg skal bruge alt det der står i tabellen!
Avatar billede justdoit Nybegynder
26. oktober 2002 - 11:34 #8
Er det en af jer der ved hvordan jeg laver Join løsning, sådan at jeg udskriver aller kategorier og til hver kategori, skal udskrives alle de u_katagorier der passer til??
Avatar billede proaccess Nybegynder
27. oktober 2002 - 08:36 #9
INDEX: Når du udvælger records efter et givent kriterie (her Kategori.kategoriid og U_Katagori.u_kategoriid), så er det klart en fordel hvis der er oprettet et index på hvert af disse felter for at forbedre søgetiden. Det går lidt ud over opdateringstiden ved ændring af poster, da index så også skal opdateres, men det er en minimal difference.
Jeg gættede mig til din ID-kolonnes navn i Kategori-tabellen, det bruger jeg igen nu... så hvis det er forkert, skal du rette begge steder.

JOIN: i denne situation, hvor du åbenbart kun skal bruge max 8 underkategorier pr. hovedkategori, vil jeg IKKE anbefale joins.
MEN - udgangspunktet ville i modsat fald hvae været:
SELECT ho.*, un.*
FROM Kategori ho INNER JOIN U_Kategori un ON ho.kategoriid = un.u_kategoriid
ORDER BY ho.kategoriid, un.u_kategoriid;
(order by er kun medtaget for at "samle" dine data)
Princippet ved denne JOIN-Løsning er at du hele tiden får ALLE data med fra BEGGE tabeller. Derfor skal din ASP-kode holde styr på hvornår hovedkategoriid'et skifter, for på det tidspunkt at lave en ny overskrift...

LIMIT 8: Jeg mener ud fra din kode at kunne læse at du maksimalt skal bruge 8 records fra underkategori-tabellen ved hver gennemgang. Det er derfor uhensigtsmæssigt at bruge tid på at hente ALLE records fra tabellen. Hvis der pludselig er 100.000 underkategorier skal de læses ind, hvorefter du lader være med at bruge de 99.992... Overdrivelse fremmer forståelsen ;0)
Avatar billede justdoit Nybegynder
28. oktober 2002 - 08:58 #10
Det er rigtigt at jeg kun skal bruge 8 udtræk fra underkategorien, men er det så ikke netop LIMIT 8 jeg skal bruge?

Men noget de undre mig er også som jeg skrev i starten: Det mærklige er også, at et gammelt site jeg har lavet i Access, som virkede fint da jeg lavede det(altså var hurtigt), - det er også blevet utroligt langsomt, og det var det ikke før???

Hvad kan der være sket?
Avatar billede proaccess Nybegynder
28. oktober 2002 - 09:01 #11
JO - Jeg råder dig til at bruge LIMIT 8 !!!

Hvad der nermere er sket i din gamle Acess-DB, kan jeg ikke gennemskue med mindre der også hér er tale om, at du henter MANGE flere poster end du skal bruge...
Avatar billede justdoit Nybegynder
28. oktober 2002 - 09:11 #12
Det virker som om at alle steder hvor jeg bruge en db på min computer, er blevet langsom!!

Jeg tænkte på at uploade min website, for at se om hastigheden er hurtig på nettet! Men jeg får nogle problemer når jeg ska lave connection til min db fra fx. www.friserverplads.dk - kender du noget til hvordan jeg gør dette?
Avatar billede justdoit Nybegynder
28. oktober 2002 - 09:16 #13
Dette er fejlen:

Microsoft OLE DB Provider for ODBC Drivers error '80004005'

[TCX][MyODBC]Access denied for user: 'smede@localhost' to database 'hzo'
Avatar billede proaccess Nybegynder
28. oktober 2002 - 09:21 #14
Det er da vist et helt andet spørgsmål...
Avatar billede justdoit Nybegynder
28. oktober 2002 - 09:23 #15
Ja, det har du ganske ret i, men det er stadig for at finde fejlen!
Avatar billede justdoit Nybegynder
12. november 2002 - 17:27 #16
Har ikke fundet fejlen!!!
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
Computerworld tilbyder specialiserede kurser i database-management

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