04. februar 2002 - 17:26Der 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)?
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 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...
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.
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?
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.
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?
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.
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?
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.