15. april 2010 - 00:00Der 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
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.
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.
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?
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.
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?
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.