Avatar billede bernhof Nybegynder
04. februar 2002 - 17:26 Der er 7 kommentarer og
1 løsning

Vedr. paging

Jeg sidder her med et paging system, som jeg synes burde optimeres lidt.

Problemet er, at alle søgeresultater hentes frem fra databasen, hvorefter kun de 15 bliver vist.

Er det muligt at specificere hvor mange resultater man vil hente fra db'en i SQL-koden, og evt. også hvorfra man vil begynde (eks. fra resultat 30 og 15 resultater frem)?

/Mikbj
Avatar billede coltau Juniormester
04. februar 2002 - 17:44 #1
Jeg formoder at du anvender kommanderne RS.PageSize = 15 og RS.AbsolutePage = "aktuelle side der skal vises"

Det kan så vidt jeg ved ikke optimeres særlig meget. Måske lidt.

Du ved altid hvilken side der skal vises. Derfor kan du anvende denne SQL-sætning:

select top XX * from tabel where osv...

hvor xx er beregnet således at recordsæt altid kun indeholder nok poster til at vise aktuelle side. Det vil sige at når første side vises er XX=15 når side 2 vises er XX=30 osv. (det kan beregnes)
Samtidig kan du vinde ved kun at udtrække netop de felter der skal anvendes og ikke anvende * for alle felter.

Jeg kender desværre ikke andre metoder.
Avatar billede bernhof Nybegynder
04. februar 2002 - 18:11 #2
jeg benytter mig nemlig ikke af denne metode.. det var netop sådan en jeg ledte efter! :)

for lige at være sikker på at jeg forstår:
RS.PageSize fortæller hvor mange records der skal hentes, og TOP XX vælger hvorfra i resultaterne den skal begynde..

Eks.:
RS.PageSize = 15
RS.Open "SELECT TOP 30 * FROM users WHERE username Like '%abc%'"

Denne henter 15 resultater efter resultat nr. 30 som passer til det valgte søgekriterie...

har jeg ret? :)
Avatar billede coltau Juniormester
04. februar 2002 - 18:32 #3
Desværre nej. !
RS.PageSize fortæller hvormange poster der skal vises pr. side således at kommandoerne () virker efter det.

Her er en normal kode til paging:

strConnect = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & "d:\localsrv\wwwroot\test\test.mdb"

Set objConn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject ("ADODB.Recordset")
  RS.CursorLocation = 3 ' adUseClient
  RS.CursorType = 3 ' adOpenStatic
  RS.CacheSize = 3
objConn.Open strConnect
RS.Open "select * from Images", objConn, , , &H0001 ' adCmdText


If Not rs.EOF Then
  'No of Records on each Page
  rs.PageSize = 15 ' jeg inddeler nu recordsættet i sider af 15 poster
  rs.AbsolutePage = intPage ' 1=Post 1-15 / 2=Post 16-30 osv.
  intPageCount = rs.PageCount ' Antallet af sider i recordsættet.
Avatar billede bernhof Nybegynder
04. februar 2002 - 18:41 #4
ahh, ok .. jeg forstår!

lige to spm.:

1) I hvilken sammenhæng kan SELECT TOP XX så bruges?
2) Kan man ikke sætte RS.PageSize og RS.AbsolutePage -inden- recordsættet åbnes, sådan den ikke åbner resultater fra den næste side, som jeg jo ikke får brug for på denne side?
Avatar billede coltau Juniormester
04. februar 2002 - 19:04 #5
1. Select top XX er først interessant når du har fået det til at virke. ! Det er jo optimering og det skal helst ikke genrere når man koder.
2. De to parametre kan netop ikke sættes før recordsættet er hentet og kan dermed ikke anvendes til optimering.

Men - skift lige denne linie:
RS.CursorLocation = 3 ' adUseClient
til
RS.CursorLocation = 2 ' adUseServer
Så laves dit udtræk på serveren og du får kun de poster du beder om når du har sat de to andre parametre.
Så man kan sige at denne metode er optimeret.
Avatar billede bernhof Nybegynder
05. februar 2002 - 14:55 #6
Det forstår jeg ikke hvordan det optimerer.

Hvis jeg starter med at sætte
RS.CursorLocation = 2 'adUseServer
og jeg herefter åbner
RS.Open "SELECT bla bla"
hvorefter
RS.PageSize = 15
og
RS.AbsolutePage = 2
sættes, har jeg da stadig hentet flere records vha. SELECT-sætningen, end jeg ville få brug for på siden!?
Men jeg gør det måske her i forkert rækkefølge?
Avatar billede coltau Juniormester
05. februar 2002 - 15:10 #7
Nej - du har ret.
Normalt henter man alle de records det drejer sig om - men de er ikke sendt til ASP-klienten (din asp-kode) endnu.
Derefter anvender man RS.PageSize og RS.AbsolutePage til at sikre at du kun får netop de records som du skal vise på siden. (og ikke alle records)
Så man kan sige at det er optimeret i forvejen.

Hvis man så vil optimere yderligere kan man jo prøve med mit første svar.

Du kan dog sætte RS.CursorType = 2 ' adOpenKeySet som betyder at databasen ikke laver udtrækket med alle poster - men kun laver et sæt med nøgler - hvilket vil være hurtigere.
Avatar billede bernhof Nybegynder
05. februar 2002 - 16:37 #8
ok .. det lyder godt
du får dine point.. men RS.CursorType kan vist også sættes til adOpenForwardOnly mener jeg den hedder...
Hvad er forskellen på denne og adOpenKeySet?
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