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?
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.
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
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.
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
15. februar 2007 - 09:55
#5
Det er bare super hmortensen ;o)
Har du lyst til at afgive et svar?
15. februar 2007 - 10:02
#6
Har du fået det til at virke?
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)
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.
Kurser inden for grundlæggende programmering