Avatar billede madiedk Nybegynder
15. april 2010 - 00:00 Der er 11 kommentarer og
1 løsning

indsætte 60000 rækker med forall

Hej

Jeg har 60000 rækker jeg skal indsætte i en oracledatabse, via java. Jeg ved at man kan gøre det via pl/sql med en operator der hedder forall hvorved man undgår en masse context switches og derved opgår hastighedsforbedringer på over 10x. Jeg kender næsten intet til pl/sql, så er der nogle der kan hjælpe mig med en pl/sql stored procedure. Den skal være i stand til at kunne tage parameter.
tak på forhånd
Avatar billede arne_v Ekspert
15. april 2010 - 00:28 #1
FORALL kan bruges til optimere hvis data der skal indsaette allerede er i en anden tabel i databasen.

Men jeg kan ikke se hvordan du kan bruge den hvis data befinder sig udenfor databasen.

Men hvor meget tid vil du bruge paa det?

Hvis den Oracle koerer paa noget rimeligt hardware og der ikke er LOB's i data, saa burde du vil kunne indsaette de raekker helt normalt paa en 15-60 sekunder!

Du kan optimere load fra Java lidt ved at bundte flere INSERT i en enkelt transaktion.
Avatar billede madiedk Nybegynder
15. april 2010 - 12:09 #2
Jeg læser da bare flere steder på nettet at man kan optimere med forall pga man undgår contect switches hvilket giver god mening, også selv om data befinder sig uden for databasen. lige nu tager det 40 sekunder pr. 5000 række. i min java kode indsætter jeg det hele som 1 transaktion ved at slå autocommit fra og så først commite når alle rækker er indsat. Der er ikke LOB's i data det er 20 kolonner med "normal" data.
Avatar billede arne_v Ekspert
15. april 2010 - 16:48 #3
40 sekunder per 5000 raekker er ret langsomt.

Har du nogen ide om hvor flaskehalsen ligger? server diskene? server CPU? client CPU? server memory?

Men 60000/5000*40 sekunder er statdig kun 8 minutter, saa medmindre det skal laves rigtigt mange gange er det begraenset hvor meget tid det kan betale sig at bruge paa at optimere.

Bruger du en enkelt PreparedStatement til all INSERT?
Avatar billede madiedk Nybegynder
18. april 2010 - 21:25 #4
nej, ved ikke hvor flaskehalsen skulle være, jeg har desuden ikke rettigheder til at ændre cache/buffer i databasen eller andre tuning parameter.

Jeg bruger prepared statement og det hele i én transaktion. det er en java arraylist af arraylists som er paremeter i mit prepared statement. Det er noget der skal køre hver dag.

Som jeg forstod det, Vil jeg med pl/sql forall overfører al data til oracle som så vil indsætte det bagefter så jeg undgår contect switch mellem sql og pl/sql hele tiden.

Det er desuden oracle OCI driver jer benytter til at forbinde.
Avatar billede madiedk Nybegynder
11. maj 2010 - 23:24 #5
hvis 40 sekunder per 5000 række er ret langsomt, hvad ville være normalt og hvordan ville jeg kunne se hvor flaskehalsen er? eller hvor ville den typisk være?
Avatar billede arne_v Ekspert
12. maj 2010 - 02:11 #6
Jeg vil forvente ca. 1000-3000 per sekund for en desktop PC.

100000-300000 per sekund på den maskine som Oracle brugte til sidste TPC-C resultat (hvis du har de 18 M$ som den config koster).
Avatar billede arne_v Ekspert
12. maj 2010 - 02:13 #7
Du skal jo igang med noget OS og DB monitoering.

Det ligger lidt udenfor mit ekspertise område.

Men det findes.

Du kan jo starte med at måle CPU forbrug og memory forbrug på loader og database.
Avatar billede arne_v Ekspert
13. juni 2010 - 04:45 #8
Kommet videre?
Avatar billede madiedk Nybegynder
14. juni 2010 - 11:53 #9
både og, mangler stadig lidt hjælp til hvordan jeg "feeder" en pl/sql procedure med et eksternt array (f.eks. java)
Avatar billede madiedk Nybegynder
22. august 2010 - 21:50 #10
nogle forslag?
Avatar billede arne_v Ekspert
29. august 2010 - 01:05 #11
Du creater en oracle.sql.ARRAY, fylder data i den og bruger den som argument til setArray på dit CallableStatement.

http://download-west.oracle.com/docs/cd/B10501_01/java.920/a96654/oraarr.htm#1040124

har lidt detaljer.
Avatar billede madiedk Nybegynder
06. oktober 2010 - 17:24 #12
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
Computerworld tilbyder specialiserede kurser i database-management

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