Avatar billede cobra Nybegynder
22. maj 2006 - 16:08 Der 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")
%>

    <tr>
        <td>&nbsp;<%=rs("Postal_code")%>&nbsp;</td>
        <td>&nbsp;<%=rs("city")%>&nbsp;</td>
        <td>&nbsp;<%=myImagex%> - <%=myImagey%>&nbsp;</td>
        <td>
        <a target="retpost" href="retpostxy.asp?id=<%=id%>&myImage.x=<%=myImagex%>&myImage.y=<%=myImagey%>">
        <img border="0" src="images.asp?myImage.x=<%=myImagex%>&myImage.y=<%=myImagey%>" width="40" height="40"></a></td>
    </tr>
   
<%   
  intRecCount = intRecCount - 1
  rs.MoveNext
  Loop
End If
rs.Close
Set rs = Nothing
%>
</table>
<%
Response.Write "<p>Gå til side "
For intNum = intPage To intPage+100
Response.Write "<a href=?page=" & intNum & ">" & intNum & "</a> "
Next

Response.Write "<p>"
If Clng(intPage) > 1 Then
  Response.Write "<a href=?page=" & intPage - 1 & ">&lt;&lt;</a>"
Else
  Response.Write "&lt;&lt;"
End If

Response.Write "&nbsp;"

If Clng(intPage) < Clng(intPageCount) Then
  Response.Write "<a href=?page=" & intPage + 1 & ">&gt;&gt;</a> "
Else
  Response.Write "&gt;&gt;"
End If
%>
Avatar billede softspot Forsker
22. maj 2006 - 16:26 #1
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

vis postnr for den påg. side
Avatar billede cobra Nybegynder
22. maj 2006 - 16:51 #2
Kan du vise ex på det?
Avatar billede softspot Forsker
22. maj 2006 - 17:11 #3
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).
Avatar billede softspot Forsker
22. maj 2006 - 17:13 #4
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

  getPageIDs = strIDs
end function
Avatar billede cobra Nybegynder
08. juli 2006 - 17:34 #5
Er ved at rytte op
Avatar billede softspot Forsker
08. juli 2006 - 17:43 #6
Ja, så kunne du da lige spørge om jeg var interesseret i point inden du tog dem selv...(?) - men velbekomme da.
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