Avatar billede sporge_jorgen Nybegynder
15. februar 2007 - 07:54 Der er 7 kommentarer og
1 løsning

Delvist database udtræk

Jeg skal lave et komplet udtræk fra en tabel i en database med 800.000 rækker og herefter behandle hver enkelt element.
Men jeg vil helst undgå at hente alle 800.000 rækker ind i JVM'en.
I stedet vil jeg gerne have databasen til at opbevare en pointer til, hvor i min udsøgning jeg er nået til fx. jeg henter 10.000 rækker ind i java, behandler dem, og requester næste portion á 10.000 rækker indtil alle er behandlet.

Kan dette lade sig gøre i Java?
Avatar billede europe Nybegynder
15. februar 2007 - 08:03 #1
Vil godt mene at det kan lade sig gøre.

Ved at hvis man arbejder i en oracle database kan man bruge rownum i sin where clause på query for du at x-antal rækker ud.

eks. på hvordan man henter de første 10000 række i oracle sql
Select user_name, password
from users
where rownum <= 10000

Det ville være en måde til at lade databasen holde pointeren til hvor langt man er kommet med behandlingen af rækker.
Avatar billede hmortensen Nybegynder
15. februar 2007 - 08:08 #2
Eller hvis der er et id, gemme id for sidste behandlede række, og i næste hug, hente alle der har id større end det forrige, og så sætte en limit på.

I mySQL er det dog mere simpelt.
LIMIT index, antal
Avatar billede sporge_jorgen Nybegynder
15. februar 2007 - 08:13 #3
limit?? Det er ikke lige noget jeg har hørt om.
Er det bare en del af SQL'en?

Ved ikke om det giver nogen begrænsninger, men det er en DB2 database.
Avatar billede hmortensen Nybegynder
15. februar 2007 - 08:18 #4
LIMIT er kun til mySQL.

i DB2 burde du kunne gøre sådan her.

Første query:
SELECT * FROM tabel ORDER BY idFelt FETCH FIRST 10000 ROWS ONLY

Så gemmer du id'et i en tmp variabel, så efter sidste gennemløb, vil den indeholde det højeste id.

Når så id er sat, kan du gøre sådan her:
SELECT * FROM tabel WHERE idFelt > ditTmpId ORDER BY idFelt FETCH FIRST 10000 ROWS ONLY
Avatar billede sporge_jorgen Nybegynder
15. februar 2007 - 09:55 #5
Det er bare super hmortensen ;o)
Har du lyst til at afgive et svar?
Avatar billede hmortensen Nybegynder
15. februar 2007 - 10:02 #6
Har du fået det til at virke?
Avatar billede sporge_jorgen Nybegynder
15. februar 2007 - 10:11 #7
Jepper. Har dog lige fået af vide at der muligvis er noget der er smartere.
Jeg smidder en kommentar, hvis jeg finder ud af noget :O)
Avatar billede arne_v Ekspert
15. februar 2007 - 16:16 #8
Jeg tror slet ikke at der er et problem.

En normal query som returnerer et normalt ResultSet vil for de fleste databaser
goere det du oensker - din kode laeser en raekke af gangen - JDBC driveren har
en buffer paa 10 eller 100 raekker som din kode laeser fra og naar bufferen er
tom laeser den en ny klump fra databasen.

Hvis du fortaeller JDBC driveren at du vil kunne laese baglaens i ResultSet
og ikke kun fremad, saa vil JDBC driveren nok forsoege at cache alle raekker
i memory. Men det kan man jo lade vaere med.
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