olona Skrevet 27. oktober 2006 Del Skrevet 27. oktober 2006 Heisann. Jeg bruker DBI pakken og skal inserte en masse rader inn i en tabell fra en fil. Jeg vil gjerne ha det så fort som mulig, men samtidig dynamisk. Det vil si at jeg ikke alltid vet hvor hvilken tabell det skal inn i. Jeg har brukt en prepare statement med "insert into verdi1,verdi2 .. values(?,? ..) som blir bygd opp dynamisk avhengig av tabellen som skal populeres. Jeg laster så inn filen og bygger opp "statementet" med bind_params for hver verdi i en rad. Deretter utfører jeg et exceute(). Vet noen hvor stor forskjell dette har i forhold til å kjøre en execute(verdi1,verdi2..) ? Håper noen skjønner hva jeg spør om her Lenke til kommentar
HeltNils Skrevet 29. oktober 2006 Del Skrevet 29. oktober 2006 Kan du ikke ha en sth for hver tabell? Lenke til kommentar
olona Skrevet 30. oktober 2006 Forfatter Del Skrevet 30. oktober 2006 Jeg vet ikke alltid hvilken tabell det skal inn i, det skal styres fra en kontrollfil. Lenke til kommentar
Torbjørn Skrevet 2. november 2006 Del Skrevet 2. november 2006 kan det være at du har litt uheldig design på din sql database? Lenke til kommentar
olona Skrevet 3. november 2006 Forfatter Del Skrevet 3. november 2006 Det kan være at designet er uheldig, men det er ikke så relevant. Dataen skal inn i tabellen. Ferdig med det Spørsmålet er vel egentlig hva er den kjappeste måten å få inn data på inn i en tabell fra fil. Og deretter vil jeg gjøre dette dynamisk fra en styringsfil. Lenke til kommentar
Torbjørn Skrevet 3. november 2006 Del Skrevet 3. november 2006 redesign ditt system! Lenke til kommentar
olona Skrevet 6. november 2006 Forfatter Del Skrevet 6. november 2006 redesign ditt system! 7211236[/snapback] Ikke noe galt med systemet - ok Lenke til kommentar
Torbjørn Skrevet 6. november 2006 Del Skrevet 6. november 2006 (endret) prepare et statment for hver tabell da EDIT: først nå jeg kom på at det var deg Endret 6. november 2006 av Torbjørn Lenke til kommentar
HeltNils Skrevet 7. november 2006 Del Skrevet 7. november 2006 (endret) Hva er en styringsfil/kontrollfil? Endret 7. november 2006 av HeltNils Lenke til kommentar
olona Skrevet 13. november 2006 Forfatter Del Skrevet 13. november 2006 Torbjørn: Hehe. HeltNils: Styringsfil/kontrollfil (samme tingen) er bare hva jeg kaller filen skal "styre" selve perl scriptet. Altså, ved å redigere kontrollfilen så skal man kunne endre tabellnavn man importerer til. Jeg vil altså ikke "hardcode" noen tabellnavn eller kolonner i scriptet. Årsak til dette er for å ha et universelt script som, ved å endre kontrolfila, skal kunne importere data til hvilken som helst tabell. Lenke til kommentar
Torbjørn Skrevet 13. november 2006 Del Skrevet 13. november 2006 kan du ikke bruke en parameter på kommandolinja? ./ditt_script.pl --table brus_og_snadder --import raw_data.txt eller no? Lenke til kommentar
HeltNils Skrevet 13. november 2006 Del Skrevet 13. november 2006 Jeg skjønner ikke helt hva som er problemet. Hvis alle i en sesjon skal inn i samme tabell, genererer du et preparestatement når perlscriptet starter, og hvis en fil har data for flere tabeller i tilfeldig rekkefølge oppretter du en ny sth hver gang du kommer over en ny tabell. Den legger du i en hashtabell med key = tabellnavn, slik at du kan bruke den om igjen neste gang du skal legge inn data i samme tabell. Lenke til kommentar
olona Skrevet 21. november 2006 Forfatter Del Skrevet 21. november 2006 Det er egentlig det jeg gjør. Kjører et script og som tar en tabell som et parameter. Deretter skal jeg importere dette. Her kom problemet (nå jobber jeg ikke lenger hvor man skal bruke dette så det er ikke så viktig for meg lenger) det går for tregt. Jeg kjørte prepare statements i utgangspunktet, men dette går for tregt. Jeg prøvde meg med execute (verdi1,verdi2..) istedet for execute (sql) og dersom jeg hardcoded kolonnenavn og tabellnavn gikk det ufattelig mye kjappere enn ved prepare statements. Det er mye data det er snakk om, filene som importeres kommer lett opp i 12GB pluss... derfor må vi ha hurtighet. Lenke til kommentar
Torbjørn Skrevet 21. november 2006 Del Skrevet 21. november 2006 men hvis du da spesifiserer tabellnavn og kjører en prepare på en streng med vairabel for tabellnavnet? noe ala dette (men bruk evt Getopt::Long el. for å lese command line parametere): my $tablename = shift or die "no table?\n"; my $sth = $dbh->prepare("insert into $tabelname values(?, ?)" ); og så loope gjennom dine 12 gb ? Hva med å forke og kjøre i parallell? Er det cpu eller minne eller io som er begrensningen når det går for tregt? Kanskje lese inn 4-5 tabeller fra kommandolinje og forke tilsvarende mange prosesser? Lenke til kommentar
olona Skrevet 21. november 2006 Forfatter Del Skrevet 21. november 2006 Tror i utgangspunktet det er prod-serveren som er problemet(som man har lite kontroll over). På test basen tok det ca 30 min, mens på serveren tar det opptil 1.5 time, under "optimale" forutsetninger. Det er nok en blanding av alt som gjør det tregt. Det er bare snakk om en fil, den skal inn i en tabell. Men jeg ville ha et generisk script som jeg kan bruke overalt, mao bare endre "kontrollfilen". I kontroll filen vil jeg kunne eks sette tabellnavn, felter som skal ha fast verdi el. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå