22. maj 2006 - 16:08Der er
5 kommentarer og 1 løsning
Hvordan kan man gøre dette hurtiger?
Jeg har en database med 27.000 tyske post nr. som jeg bruger pageing på. Men den bliver alt for langsom med at udskrive dem. Er der en anden, der har en bedre løsning?
HER ER KODE JEG BRUGER:
<% intPage = Request("page") If isNumeric(intPage) = False Or intPage < 1 Then intPage = 1 End If
Set rs = Server.CreateObject("ADODB.RecordSet") strSQL = "SELECT * FROM Postalcode where Countries ="&request.cookies("sporg") %> <table border="0"> <% rs.Open strSQL, ConStr, 1 If Not (rs.BOF Or rs.EOF) Then rs.PageSize = 7 rs.AbsolutePage = intPage intRecCount = rs.PageSize intPageCount = rs.PageCount Response.Write "<p><b>Side " & intPage & " af " & intPageCount & "</b></p>" Do While Not rs.EOF And intRecCount > 0 myImagex = rs("x") myImagey = rs("y") id = rs("id") %>
Hvis du har mulighed for det, kan du nøjes med at trække id'erne ud og gemme dem i en session-variabel, som du så kan kigge i for hver side der skal hentes (du indekserer blot frem i din liste med id'er og henter de poster der er relevante med IN-operatoren i databasen). Pseudokoden kunne være:
hvis der ikke er en session-var med id'er så hent id'er fra databasen gem id'erne i en session-var slut hvis
hvis der ikke er et sidenr så sæt sidenr = 1 slut hvis
find relevante id'er ud fra sidenr og antal pr side generer kommasepareret liste af id'er for relevante datasæt hent postnr på grundlag af id-listen
Her er de essentielle linier (utestet, men idéen burde være synliggjort).
<% ' Denne funktion henter de ID'er som ligger på den side der aktuelt skal vises... function getPageIDs(arrIDer, pageNo, pageSize) dim strIDs, i, startIdx startIdx = ((pageNo-1) * pageSize) + 1 for i = startIdx to startIdx + pageSize - 1 if ubound(arrIDer, 2) >= i then if len(strIDs) > 0 then strIDs = strIDs & "," end if strIDs = strIDs & arrIDer(0,i) end if next getPageIDs = strIDs end function
set conn = Server.CreateObject("ADODB.Connection") conn.open ConStr if isempty(session("postider")) then sql = "SELECT * FROM Postalcode WHERE Countries = "&request.cookies("sporg") set rs = conn.Execute(sql) postider = rs.getRows() ' hent indholdet af recordsettet som et 2D-array rs.close else postider = session("postider") end if
intPage = Request("page") If isNumeric(intPage) = False Or intPage < 1 Then intPage = 1 End If
Set rs = Server.CreateObject("ADODB.RecordSet") strSQL = "SELECT * FROM Postalcode WHERE id IN (" & getPageIDs(postider, intPage, 7) & ")" set rs = conn.Execute(strSQL) do while not rs.eof 'TODO: Her skal din kode til at udskrive data indsættes! 'NB: DU SKAL IKKE LAVE PAGINERING PÅ DATA, DA DET KUN ER NØDVENDIGE DATA DER ER HENTET. rs.movenext loop rs.close conn.close
'TODO: Her indsættes dine pagineringskontroller som hidtil %>
Som en ekstra kommentar til performance, kan nævnes at det er en god idé at begrænse sit udtræk til det antal kolonner der er behov for, da du så sparer en del data-transport (ikke mindst interessant, hvis du skal hente data over et langsommere netværk fra en databaseserver).
Well, i og med arrays er 0-baseret i VBS, så skal funktionen rettes lidt:
' Denne funktion henter de ID'er som ligger på den side der aktuelt skal vises... function getPageIDs(arrIDer, pageNo, pageSize) dim strIDs, i, startIdx
strIDs = "" startIdx = (pageNo-1) * pageSize
for i = startIdx to startIdx + pageSize - 1 if ubound(arrIDer, 2) >= i then if len(strIDs) > 0 then strIDs = strIDs & "," end if strIDs = strIDs & arrIDer(0,i) end if next
Ja, så kunne du da lige spørge om jeg var interesseret i point inden du tog dem selv...(?) - men velbekomme da.
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.