Avatar billede krogstrup Nybegynder
19. juni 2003 - 11:14 Der er 9 kommentarer og
1 løsning

Optimering af database kode

Jeg bruger nedenstående kode til at generere en dropdown menu (Bratta´s) i 3 niveauer - men min database kode tager ALT for lang tid om at danne menuen. Findes der en væsentlig hurtigere måde at tilgå access databasen på? Eller kan man strukturere koden helt anderledes mhp. på at forøge hastigheden ?

***********************************

<% topCount = 0
subCount = 0
subsubCount = 0

Set rs = Server.CreateObject("ADODB.RecordSet")
Set rs2 = Server.CreateObject("ADODB.RecordSet")
Set rs3 = Server.CreateObject("ADODB.RecordSet")


strSQL = "SELECT * FROM content WHERE parent = 0 and visibility = 'true' and placement = 'top' ORDER BY orderby"
rs.Open strSQL, strDSN, 1, 1
do while not rs.EOF %>

oCMenu2.makeMenu('top2<%=topCount%>','','<%=rs("title")%>','<% if rs("clickable") = "true" then %>content.asp?ID=<%=rs("ID")%>&page=text&page2=visProdukter<% end if %>','_self',<%=rs("width")%>)

<% strSQL = "SELECT * FROM content WHERE parent = " & rs("ID") & " and visibility = 'true' ORDER BY orderby"
rs2.Open strSQL, strDSN, 1, 1
if not rs2.EOF then %>

oCMenu2.makeMenu('sub2<%=subCount%>','top2<%=topCount%>','','','','',1,'/pictures/standard/clear.gif')

<% subCount = subCount + 1
do while not rs2.EOF %>

oCMenu2.makeMenu('sub2<%=subCount%>','top2<%=topCount%>','&nbsp;-&nbsp;<%=rs2("title")%>','<% if rs2("clickable") = "true" then %>content.asp?ID=<%=rs2("ID")%>&page=text&page2=visProdukter<% end if %>','_self')

<% strSQL = "SELECT * FROM content WHERE parent = " & rs2("ID") & " and visibility = 'true' ORDER BY orderby"
rs3.Open strSQL, strDSN, 1, 1
if not rs3.EOF then %>

oCMenu2.makeMenu('subsub2<%=subsubCount%>','sub2<%=subCount%>','','','','',1,'/pictures/standard/clear.gif')

<% subsubCount = subsubCount + 1
do while not rs3.EOF %>

oCMenu2.makeMenu('subsub2<%=subsubCount%>','sub2<%=subCount%>','-&nbsp;<%=rs3("title")%>','<% if rs3("clickable") = "true" then %>content.asp?ID=<%=rs3("ID")%>&page=text&page2=visProdukter<% end if %>','_self')

<% rs3.MoveNext
subsubCount = subsubCount + 1
loop %>

//oCMenu2.makeMenu('subsub2<%=subsubCount%>','sub2<%=subCount%>','','','','',1,'/pictures/standard/clear.gif')

<% subsubCount = subsubCount + 1
end if
rs3.Close %>

<% rs2.MoveNext
subCount = subCount + 1
loop %>

//oCMenu2.makeMenu('sub2<%=subCount%>','top2<%=topCount%>','','','','',1,'/pictures/standard/clear.gif')

<% subCount = subCount + 1
end if
rs2.Close %>

<% rs.MoveNext
topCount = topCount + 1
loop
rs.Close



Set rs = Nothing
Set rs2 = Nothing
Set rs3 = Nothing %>
Avatar billede krogstrup Nybegynder
19. juni 2003 - 11:43 #1
Her er samme kode forenklet - viser tydeligt princippet i den måde jeg looper gennem databasen på....

***********************************************************************

<% Set rs = Server.CreateObject("ADODB.RecordSet")
Set rs2 = Server.CreateObject("ADODB.RecordSet")
Set rs3 = Server.CreateObject("ADODB.RecordSet") %>





<% strSQL = "SELECT * FROM content WHERE parent = 0 and visibility = 'true' and placement = 'top' ORDER BY orderby"
rs.Open strSQL, strDSN, 1, 1
do while not rs.EOF %>


BLA BLA BLA


<% strSQL = "SELECT * FROM content WHERE parent = " & rs("ID") & " and visibility = 'true' ORDER BY orderby"
rs2.Open strSQL, strDSN, 1, 1
do while not rs2.EOF %>


BLA BLA BLA


<% strSQL = "SELECT * FROM content WHERE parent = " & rs2("ID") & " and visibility = 'true' ORDER BY orderby"
rs3.Open strSQL, strDSN, 1, 1
do while not rs3.EOF %>

BLA BLA BLA


<% rs3.MoveNext
loop
rs3.Close

rs2.MoveNext
loop
rs2.Close

rs.MoveNext
loop
rs.Close %>






<% Set rs = Nothing
Set rs2 = Nothing
Set rs3 = Nothing %>
Avatar billede nielle Nybegynder
19. juni 2003 - 12:00 #2
1) Prøv at ret dine "SELECT *" til kun at omfatte de værdier du rent faktisk skal bruge (f.eks. bruger du vist ikke visibility eller placement  til noget i selve ASP scriptet).

2) Overvej om det nu virkelig er SQL delen der er problemet. Måske er det i virkeligheden din oCMenu2.makeMenu som trækker tænder ud. Det fremgår ikke direkte om dette er JavaScript, men hvis det er så har jeg personligt oplevet dette ved tidligere lejligheder.
Avatar billede krogstrup Nybegynder
19. juni 2003 - 12:04 #3
Jeg har prøvet at indsætte det egentlige javascript output fra Aspscriptet direkte i min javascript fil. Og når javascriptet ikke afvikler min ASP kode, går det lynende hurtigt med afvikling af javascriptet.

Så det er helt sikkert min ASP kode der afvikles for langsomt !!!
Avatar billede nielle Nybegynder
19. juni 2003 - 12:09 #4
Hvis det er tilfældet så burde du måske overveje med dig selv om du ikke skulle lægge SQL-delen på hylden og så kun lave det i JavaScript. Surt, ja jeg ved det...
Avatar billede nielle Nybegynder
19. juni 2003 - 12:12 #5
Din visibility - hvad laver den? Markere den hvilke menupunkter der er åbne eller ej. Det ser nemlig lidt sådan ud.

Hvis det er tilfældet, så vil du da få problemer hvis der er mere en een bruger som ønsker at tilgå din side på samme tid!
Avatar billede krogstrup Nybegynder
19. juni 2003 - 12:19 #6
Nu har jeg ændret min SELECT så jeg kun henter felter jeg rent faktisk bruger, men det har desværre IKKE ændret på hastigheden :-(


Du kan se hvad jeg mener i praksis her:


Langsomme sideskift:
http://brugtdata.wkh.dk

Hurtige sideskift:
http://brugtdata2.wkh.dk


Og nej, jeg kan desværre ikke undvære SQL kaldene - Siderne SKAL genereres fra en database, da der ligger et CMS system bagved.

Det MÅ da kunne lade sig gøre at hente fra databasen hurtigere !!!!
Avatar billede mailand Nybegynder
20. juni 2003 - 18:01 #7
Her er en loesning, der kun kraever 1 sqlsaetning og 1 connection - det skulle gerne forbedre lidt...

Slutteligt er et eksempel paa en rekursiv funktion (en funktion, der kalder sig selv), som maaske ikke er saa anvendelig i dette tilfaelde, men som demonstrerer hvordan man kan lave 'uendelige niveauer'....

---------------------
Loesning 1, 3 niveauer

strSql = "SELECT ID, title, content, visibility, clickable, orderBy, parent, module, password, width, placement FROM content WHERE visibility = 'true' AND placement = 'top' ORDER BY orderBy"

set rs = server.createobject("adodb.recordset")
rs.open strSql, strCon
arrMenu = rs.getrows()
rs.close
set rs = nothing

for i = 0 to ubound(arrMenu,2)
    if int(arrMenu(6,i)) = 0 then
        ' hent records ud hvor parent = 0
       
        for n = 0 to ubound(arrMenu,2)
            if int(arrMenu(6,n)) = int(arrMenu(0,i)) then
                ' henter 2. niveau
               
                for x = 0 to ubound(arrMenu,2)
                    if int(arrMenu(6,x)) = int(arrMenu(0,n)) then
                        ' henter 3. niveau
                    end if
                next
               
            end if
        next
       
    end if
next




---------------------
Loesning 2, som rekursiv funktion



function hentMenuAndSubs(arrMenu,intParentId,intIndent)
    strOut = ""
    strIndent = ""
   
    if intIndent > 0 then
        for n = 1 to intIndent
            strIndent = strIndent & "&nbsp;&nbsp;"
        next
    end if

    for i = 0 to ubound(arrMenu,2)
        if int(arrMenu(6,i)) = int(intParentId)
            strOut = strOut & strIndent & arrMenu(1,i) & vbcrlf
            strOut = strOut & hentMenuAndSubs(arrMenu,arrMenu(0,i),intIndent + 1)
        end if   
    next
   
    hentMenuAndSubs = strOut
end function


---------------------

Haaber det kan bruges til et eller andet.

Cheers til kbh. :o)
Avatar billede nielle Nybegynder
04. august 2003 - 21:45 #8
Lukketid?!
Avatar billede krogstrup Nybegynder
04. august 2003 - 22:05 #9
mailand >>>
Smider du ikke et svar - dit kode eksempel forbedrede rent faktisk performance på min ASP kode :-)
Avatar billede mailand Nybegynder
12. august 2003 - 00:22 #10
et svar... :o)
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