Gå til innhold

Anbefalte innlegg

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 :D

Lenke til kommentar
Videoannonse
Annonse

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: 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

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

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

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...