19. juni 2003 - 11:14Der 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 %>
<% subCount = subCount + 1 do while not rs2.EOF %>
oCMenu2.makeMenu('sub2<%=subCount%>','top2<%=topCount%>',' - <%=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 %>
<% subsubCount = subsubCount + 1 do while not rs3.EOF %>
oCMenu2.makeMenu('subsub2<%=subsubCount%>','sub2<%=subCount%>','- <%=rs3("title")%>','<% if rs3("clickable") = "true" then %>content.asp?ID=<%=rs3("ID")%>&page=text&page2=visProdukter<% end if %>','_self')
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
<% 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 %>
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.
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 !!!
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...
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 & " " 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
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.